关于Web API 2.0中的Options请求返回405的问题

关于Web API 2.0中的Options请求返回405的问题

前提:IIS寄宿的网站

当你向服务器发送非简单请求时,客户端会先发送一条预检请求,借以确认当前请求源和待请求方法是否被网站允许。(关于这种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文件中添加自定义模块。

以下是自定义模块程序示例:

    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方法具体在工程中应当如何设计逻辑,一定要认真思考哦。

posted @ 2017-04-14 23:33  祁去尘  阅读(270)  评论(0编辑  收藏  举报