溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域怎么設(shè)置

發(fā)布時(shí)間:2021-03-05 16:04:53 來(lái)源:億速云 閱讀:167 作者:TREX 欄目:開發(fā)技術(shù)

這篇文章主要講解了“ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域怎么設(shè)置”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域怎么設(shè)置”吧!

跨域條件

跨域是指的當(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ì)簡(jiǎn)單跨域請(qǐng)求有效,無(wú)法處理復(fù)雜的跨域請(qǐng)求。

簡(jiǎn)單請(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)致的。

注意:簡(jiǎn)單請(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)頁(yè)所在的域名是否在服務(wù)器的許可名單之中,以及可以使用哪些HTTP動(dòng)詞和頭信息字段。只有得到肯定答復(fù),瀏覽器才會(huì)發(fā)出正式的XMLHttpRequest請(qǐng)求,否則就報(bào)錯(cuò),而這次preflight的Http方法就是Options。換句話說(shuō),如果你的xhr請(qǐng)求發(fā)出前,會(huì)先發(fā)出一個(gè)Options請(qǐng)求,就說(shuō)明你要執(zhí)行的請(qǐng)求是復(fù)雜請(qǐng)求。

復(fù)雜請(qǐng)求處理

在Global.asax文件中,通過(guò)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)了。

總結(jié)

感謝各位的閱讀,以上就是“ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域怎么設(shè)置”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域怎么設(shè)置這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI