什麼是options請求 options請求為發送非簡單跨域請求前的預檢請求,若該請求未正常返回,瀏覽器會阻止後續的請求發送。 一般情況下,有三種方式會導致瀏覽器發起預檢請求 1.請求的方法不是GET/HEAD/POST 2.POST請求的Content Type並非application/x ww ...
什麼是options請求
options請求為發送非簡單跨域請求前的預檢請求,若該請求未正常返回,瀏覽器會阻止後續的請求發送。
一般情況下,有三種方式會導致瀏覽器發起預檢請求
1.請求的方法不是GET/HEAD/POST
2.POST請求的Content-Type並非application/x-www-form-urlencoded, multipart/form-data 或 text/plain
3.請求中設置了自定義的header欄位(如Token)
瀏覽器發出請求但直接返回404
若未對iis進行配置,則會導致options請求被iis直接響應返回,而不會進入到代碼中。這也是Global中的Application_BeginRequest無法捕獲到options請求的原因。1.檢查webconfig中的配置,是否移除了對options請求的特殊處理
可在iis中進行配置:[網站]-[應用程式]-[處理程式映射]
<system.webServer>
<handlers>
<remove name="OPTIONSVerbHandler" />
</handlers>
</system.webServer>
2.檢查iis伺服器是否安裝了UrlScan,若安裝了請檢查AllowVerbs中是否包含了options
可在iis中查看是否安裝了UrlScan [網站]-[ISAPI篩選器] (可以找到UrlScan安裝路徑)
UrlScan的配置文件為UrlScan.ini (C:\Windows\System32\inetsrv\urlscan\UrlScan.ini)
將OPTIONS從[DenyVerbs]中移除並添加到[AllowVerbs]下
3.在Global的Application_BeginRequest實踐中直接響應options請求
//允許所有的options請求,直接返回200狀態碼
private void Application_BeginRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.StatusCode = 200;
HttpContext.Current.Response.Headers["Access-Control-Allow-Origin"] = HttpContext.Current.Request.Headers["origin"];
HttpContext.Current.Response.End();
}
}
4.在webconfig中的Allow-Method中添加上options
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET" />
<add name="Access-Control-Allow-Headers" value="x-requested-with,aspxauth" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>
</httpProtocol>
</system.webServer>