ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域設(shè)置的方法介紹
ASP.Net Core的跨域設(shè)置比較簡單 官方都整合了 具體的參見微軟官方文檔:
https://docs.microsoft.com/zh-cn/aspnet/core/security/cors?view=aspnetcore-3.1#ecors
跨域條件
跨域是指的當(dāng)前資源訪問其他資源時(shí)發(fā)起的http請(qǐng)求由于安全原因(由于同源策略,域名、協(xié)議、端口中只要有一個(gè)不同就不同源),瀏覽器限制了這些請(qǐng)求的正常訪問,特別需要注意的是這些發(fā)生在瀏覽器中。
解決方法
方法1.web.config文件中的 system.webServer 節(jié)點(diǎn)下 增加如下配置:
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/> <add name="Access-Control-Allow-Headers" value="x-requested-with,content-type"/> <add name="Access-Control-Allow-Origin" value="*" /> </customHeaders> </httpProtocol> </system.webServer>
方法2.Nuget包引用Microsoft.AspNet.Cors,然后在控制器上添加特性
[EnableCors(origins: "*", headers: "*", methods: "*")]
注意以上兩種方法,不要重復(fù)設(shè)置,設(shè)置了兩次會(huì)報(bào)錯(cuò) 'Access-Control-Allow-Origin' header contains multiple values '*, *',。
復(fù)雜請(qǐng)求問題
以上兩個(gè)方法,僅對(duì)簡單跨域請(qǐng)求有效,無法處理復(fù)雜的跨域請(qǐng)求。
簡單請(qǐng)求:請(qǐng)求方法是GET/HEAD/POST,并且contentType為text/plain、application/x-www-form-urlencoded、multipart/form-data。
不滿足上述條件的視為復(fù)雜請(qǐng)求,開發(fā)中我們常觸發(fā)這個(gè)條件大多因?yàn)槲覀兊恼?qǐng)求的contentType設(shè)置的是application/json導(dǎo)致的。
注意:簡單請(qǐng)求如果設(shè)置了Authentication認(rèn)證header也會(huì)讓請(qǐng)求“升級(jí)”為復(fù)雜請(qǐng)求。
復(fù)雜請(qǐng)求會(huì)在正式通信之前,增加一次HTTP查詢請(qǐng)求,稱為"預(yù)檢"請(qǐng)求(preflight)。瀏覽器先詢問服務(wù)器,當(dāng)前網(wǎng)頁所在的域名是否在服務(wù)器的許可名單之中,以及可以使用哪些HTTP動(dòng)詞和頭信息字段。只有得到肯定答復(fù),瀏覽器才會(huì)發(fā)出正式的XMLHttpRequest請(qǐng)求,否則就報(bào)錯(cuò),而這次preflight的Http方法就是Options。換句話說,如果你的xhr請(qǐng)求發(fā)出前,會(huì)先發(fā)出一個(gè)Options請(qǐng)求,就說明你要執(zhí)行的請(qǐng)求是復(fù)雜請(qǐng)求。
復(fù)雜請(qǐng)求處理
在Global.asax文件中,通過Application_BeginRequest方法進(jìn)行處理:
protected override void Application_BeginRequest(object sender, EventArgs e)
{
//直接設(shè)置所有的可跨域訪問
Response.Headers.Add("Access-Control-Allow-Origin",”*“);
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")//攔截處理Options請(qǐng)求
{
Response.Headers.Add("Access-Control-Allow-Headers", "*");
Response.Headers.Add("Access-Control-Allow-Methods", "*");
Response.Flush();
Response.End();
}
base.Application_BeginRequest(sender, e);
}
這樣,對(duì)Options跨域請(qǐng)求進(jìn)行了“可支持跨域”的應(yīng)答,之后的正式請(qǐng)求到達(dá)控制器中的Action,又有相應(yīng)的跨域訪問處理。那么對(duì)于整個(gè)的復(fù)雜請(qǐng)求跨域就完成實(shí)現(xiàn)了。
微軟官方參考:https://docs.microsoft.com/zh-cn/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api
總結(jié)
到此這篇關(guān)于ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域設(shè)置的文章就介紹到這了,更多相關(guān)ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域設(shè)置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用?HttpReports?監(jiān)控?.NET?Core?應(yīng)用程序的方法
這篇文章主要介紹了使用?HttpReports?監(jiān)控?.NET?Core?應(yīng)用程序的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
python scrapy項(xiàng)目下spiders內(nèi)多個(gè)爬蟲同時(shí)運(yùn)行的實(shí)現(xiàn)
這篇文章主要介紹了python scrapy項(xiàng)目下spiders內(nèi)多個(gè)爬蟲同時(shí)運(yùn)行的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
ASP.NET Core環(huán)境變量和啟動(dòng)設(shè)置的配置教程
這篇文章主要為大家詳細(xì)介紹了ASP.NET Core環(huán)境變量和啟動(dòng)設(shè)置的配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
在阿里云函數(shù)計(jì)算上部署.NET Core 3.1的方法
這篇文章主要介紹了在阿里云函數(shù)計(jì)算上部署.NET Core 3.1的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
asp.net實(shí)現(xiàn)固定GridView標(biāo)題欄的方法(凍結(jié)列功能)
這篇文章主要介紹了asp.net實(shí)現(xiàn)固定GridView標(biāo)題欄的方法,即凍結(jié)列功能,涉及GridView結(jié)合前端js操作數(shù)據(jù)顯示的相關(guān)技巧,需要的朋友可以參考下2016-06-06
在.net core中實(shí)現(xiàn)字段和屬性注入的示例代碼
這篇文章主要介紹了在.net core中實(shí)現(xiàn)字段和屬性注入的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
ASP .NET調(diào)用javascript中Response.Write和ClientScript.RegisterSta
最近在用ASP .NET的code behind 調(diào)用javascript中發(fā)現(xiàn)Response.Write不能拿到form的值,而ClientScript.RegisterStartupScript可以。2010-12-12

