首先说一下开发环境,服务器是IIS8,客户端应该是WebKit内核的浏览器,通过WebService通信。
简单说来,跨域问题是a.com访问b.com时出现的,为保证访问服务器的安全,阻止不同域名间对资源的请求(大概是这样吧)。因为客户端是基于本地HTML页面的,因此需要解决跨域问题才可以与服务器通信。
当跨域问题出现时,服务器一般会返回一个405错误,同时在控制台还可以看到一串英文(忘了),大意为访问被禁止。这时就要配置服务器的Response Head,在web.config文件中添加以下设置:
</system.webServer>
还有
</system.web>
这个据说也有用,具体没验证过。
如果一切正常的话,在此时使用XmlHttpRequest时会出现另一个405,通过分析可以知道服务器没有配置处理OPTIONS方法。因为OPTIONS方法会返回服务器允许的方法列表,可能被用于黑客攻击,所以会被禁止。但OPTIONS是跨域传送XML所必需的,因此要配置服务器来处理OPTIONS,在IIS配置中的Handler Mapping中删掉 OPTIONSVerbHandler或者是OPTIONS,就可以允许服务器处理OPTIONS。
在web.config中再添加这么一句来处理OPTIONS:
</handl ers>
就可以传送XML了。
另外使用XmlHttpRequest时要设置异步为false,原因未知。也可能是其他代码写错导致无法异步。
好了先说这么多,关于跨域的具体解释以及OPTIONS还有PreFlight等有空再添加
参考:
http://blog.darkthread.net/post-2014-09-29-cors-options-preflight-and-iis.aspx
http://stackoverflow.com/questions/15584909/cors-405-method-not-allowed/15599025
简单说来,跨域问题是a.com访问b.com时出现的,为保证访问服务器的安全,阻止不同域名间对资源的请求(大概是这样吧)。因为客户端是基于本地HTML页面的,因此需要解决跨域问题才可以与服务器通信。
当跨域问题出现时,服务器一般会返回一个405错误,同时在控制台还可以看到一串英文(忘了),大意为访问被禁止。这时就要配置服务器的Response Head,在web.config文件中添加以下设置:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type, soapaction" />
</customHeaders>
</httpProtocol>
</system.webServer>
还有
<system.web>
<webServices>
<protocols>
<add name="HttpSoap" />
<add name="HttpPost" />
<add name="HttpGet" />
<add name="Documentation" />
</protocols>
</webServices>
</system.web>
这个据说也有用,具体没验证过。
如果一切正常的话,在此时使用XmlHttpRequest时会出现另一个405,通过分析可以知道服务器没有配置处理OPTIONS方法。因为OPTIONS方法会返回服务器允许的方法列表,可能被用于黑客攻击,所以会被禁止。但OPTIONS是跨域传送XML所必需的,因此要配置服务器来处理OPTIONS,在IIS配置中的Handler Mapping中删掉 OPTIONSVerbHandler或者是OPTIONS,就可以允许服务器处理OPTIONS。
在web.config中再添加这么一句来处理OPTIONS:
<handlers accessPolicy="Read, Script">
<add name="OPTIONS" path="*" verb="OPTIONS" modules="ProtocolSupportModule" resourceType="Unspecified" />
</handl ers>
就可以传送XML了。
另外使用XmlHttpRequest时要设置异步为false,原因未知。也可能是其他代码写错导致无法异步。
好了先说这么多,关于跨域的具体解释以及OPTIONS还有PreFlight等有空再添加
参考:
http://blog.darkthread.net/post-2014-09-29-cors-options-preflight-and-iis.aspx
http://stackoverflow.com/questions/15584909/cors-405-method-not-allowed/15599025