簡單說來,跨域問題是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" /> </handlers>
就可以傳送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