7×24小时服务热线:4006-371-371
当前位置:371数据中心 - 行业动态 -正文

IIS 处理Options请求返回405的问题

更新时间:18/1/11

当你向服务器发送非简单请求时,客户端会先发送一条预检请求,借以确认当前请求源和待请求方法是否被网站允许。(关于这种Http请求的详细信息,请在道友的文章中学习)

道友的文章写的很好,其提供的解决方案是使用一个微软公司提供的官方DLL。为了不被DLL蒙在鼓里,本文提供了另外一种解决思路。

当客户端向服务器发送Options请求时,Web API 2.0默认会吃掉它并返回405以表示该操作不被支持。究竟是IIS管线中的哪个步骤吃掉了它,我没有研究明白。不过可以确定的是,问题出在Modulers里。在Web.config文件中,system.webServer下有个modules节点,如果将它的runAllManagedModulesForAllRequests属性设置为True,也可以解决options 405问题。这个属性默认是false,所以本文也不推荐这种方法。

Modules和Handler都是可以编程介入的,这个灵活性为我们提供了解决问题的渠道。具体步骤如下:
(1)在App_Code文件夹下新建一个.cs文件,自定义一个类,并实现IHttpModule接口
(2)在Init方法中,为HttpApplication的BeginRequest事件添加一个自定义过程。
(3)在自定义过程中,拦截请求,判断Request的HttpMethod属性是否是options。如果是,就将响应的状态码设置为200,然后截断后续处理,直接响应请求。
(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() { }
public void BeginRequest(object resource,EventArgs e)
{
HttpApplication app = resource as HttpApplication;
HttpContext context = app.Context;
if(context.Request.HttpMethod.ToUpper() == "OPTIONS")
{
context.Response.StatusCode = 200;
context.Response.End();
}
}
}
<system.webServer>
<modules>
<add name="exampleModule" type="SpecialMethodModuler"/>
</modules>
</system.webServer>

最后,本文只是提出了一个思路,BeginRequest方法具体在工程中应当如何设计逻辑,一定要认真思考哦。

豫公网安备 41010502002682号

豫公网安备 41010502002683号