幫助中心
技術(shù)運(yùn)維百科
iis開啟options請(qǐng)求 關(guān)于Web API 2.0中的Options請(qǐng)求返回405的問題
2017-07-11 14:46:07

前提:IIS寄宿的網(wǎng)站

當(dāng)你向服務(wù)器發(fā)送非簡(jiǎn)單請(qǐng)求時(shí),客戶端會(huì)先發(fā)送一條預(yù)檢請(qǐng)求,借以確認(rèn)當(dāng)前請(qǐng)求源和待請(qǐng)求方法是否被網(wǎng)站允許。(關(guān)于這種Http請(qǐng)求的詳細(xì)信息,請(qǐng)?jiān)诘烙训奈恼轮袑W(xué)習(xí))

道友的文章寫的很好,其提供的解決方案是使用一個(gè)微軟公司提供的官方DLL。為了不被DLL蒙在鼓里,本文提供了另外一種解決思路。

當(dāng)客戶端向服務(wù)器發(fā)送Options請(qǐng)求時(shí),Web API 2.0默認(rèn)會(huì)吃掉它并返回405以表示該操作不被支持。究竟是IIS管線中的哪個(gè)步驟吃掉了它,我沒有研究明白。不過可以確定的是,問題出在Modulers里。在Web.config文件中,system.webServer下有個(gè)modules節(jié)點(diǎn),如果將它的runAllManagedModulesForAllRequests屬性設(shè)置為True,也可以解決options 405問題。這個(gè)屬性默認(rèn)是false,所以本文也不推薦這種方法。

Modules和Handler都是可以編程介入的,這個(gè)靈活性為我們提供了解決問題的渠道。具體步驟如下: (1)在App_Code文件夾下新建一個(gè).cs文件,自定義一個(gè)類,并實(shí)現(xiàn)IHttpModule接口 (2)在Init方法中,為HttpApplication的BeginRequest事件添加一個(gè)自定義過程。 (3)在自定義過程中,攔截請(qǐng)求,判斷Request的HttpMethod屬性是否是options。如果是,就將響應(yīng)的狀態(tài)碼設(shè)置為200,然后截?cái)嗪罄m(xù)處理,直接響應(yīng)請(qǐng)求。 (4)在Web.config文件中添加自定義模塊。

以下是自定義模塊程序示例:

"language-C# hljs cs"> public class SpecialMethodModule : IHttpModule
{
public SpecialMethodModule() { }
public void Init(HttpApplication app)
{
app.BeginRequest += new EventHandler(this.BeginRequest);
}
public void Dispose() { }
新客優(yōu)惠
特價(jià) 酷睿i3系列
性價(jià)比熱銷推薦,年銷量第一
1180/月起
USA-IDC為您提供免備案服務(wù)器 0元試用
立即聯(lián)系在線客服,即可申請(qǐng)免費(fèi)產(chǎn)品試用服務(wù)