【问题标题】:IIS 7.5: How to allow a POST request with an extensionless URL and a custom HTTP module? "HTTP 405 Method Not Allowed"IIS 7.5:如何允许带有无扩展 URL 和自定义 HTTP 模块的 POST 请求? “不允许使用 HTTP 405 方法”
【发布时间】:2016-06-23 22:51:03
【问题描述】:

我为部署到本地运行的 IIS 7.5 的 C# ASP.Net 应用程序编写了 custom HTTP module。我的客户将 POST 请求发送到像 "http://localhost:9999" 这样的 URL。我可以看到我的自定义模块正在执行,并在我在自定义模块的 Init() 方法中注册的事件处理程序中返回正确的响应。但是,返回给我的客户端的实际 HTTP 响应在其标头中包含以下内容:

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS, TRACE

令人讨厌的是,我可以在 HTTP 响应的正文中看到我期望的响应,但标头告诉客户端 405 Method Not Allowed,因此客户端调用失败!请问有谁知道如何阻止这个错误?

这是我应用的 web.config 的相关部分:

  <system.webServer>
    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0"
           path="*."
           verb="*"
           type="System.Web.Handlers.TransferRequestHandler"
           preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <modules>
       <remove name="WebDAVModule"/>
       <add name="AuthServiceModule" type="AuthServiceHTTPModule.App_Code.AuthServiceModule"/>       
    </modules>
  </system.webServer>

AuthServiceModule 是我的自定义模块的名称。我在 system.webServer 元素中尝试了许多不同的选项,但似乎没有一个允许 POST 请求通过。我宁愿有一个涉及应用程序内配置而不是 IIS 本身的解决方案。

【问题讨论】:

    标签: asp.net iis


    【解决方案1】:

    由于您没有明确提及,我认为这不适用于 MVC。

    模块是请求执行期间发生的处理的一部分,但它不在 http 管道 See Here 的末尾。 (还有here 很好的说 HttpHandler 是请求列车前往的地方。HttpModule 是沿途的一个车站。)这意味着当在 asp.net 端接收到请求时,它会经过所有模块并期望处理程序对请求采取行动。当您在 handler 中处理请求并确定主响应时,响应开始遍历所有模块,然后发送回客户端。

    在上述情况下,您似乎创建了一个 http 模块但缺少一个处理程序。除非有创建模块的原因,即您想要处理的某些请求级别事件,否则我建议您必须创建一个 HTTP 处理程序并在处理程序内处理请求。这应该可以帮助您成功处理它。

    类似的东西

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace MyWorld
    {
    public class HelloWorldHandler : IHttpHandler
    {
        public HelloWorldHandler()
        {
        }
        public void ProcessRequest(HttpContext context)
        {
            HttpRequest Request = context.Request;
            HttpResponse Response = context.Response;
    
            Response.Write("<html>");
            Response.Write("<body>");
            Response.Write("<h1>Hello from a synchronous custom HTTP handler.</h1>");
            Response.Write("</body>");
            Response.Write("</html>");
        }
        public bool IsReusable
        {
            // To enable pooling, return true here.
            // This keeps the handler in memory.
            get { return false; }
        }
    }
    }
    

    然后在 web.config 中注册

     <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0"
           path="*."
           verb="*"
           type="MyWorld.HelloWorldHandler"
           preCondition="integratedMode,runtimeVersionv4.0" />    
    </handlers>
    

    【讨论】:

    • 感谢您的建议。不,据我所知,这不是 MVC。但是我必须使用处理程序吗?如果我这样做了,那么我根本不需要这个模块。我已经知道该模块有效;这只是导致 405 错误的框架。此外,在我的情况下,一个模块似乎更合适,因为我希望它在 all 请求上运行;而且我的请求也没有扩展,甚至没有请求资源。 (我实际上使用该模块来调用 Apache Thrift 处理器,因为我正在使用 Thrift/HTTP。)
    • @snark ,我展示的上述示例适用于非 mvc(常规的 asp.net 网络应用程序工作),它可以正常工作。正如我上面所说,模块用于处理请求工作流,但请求最终必须由处理程序处理。正如您在上面的示例中看到的,处理程序也没有扩展,它也将在所有无扩展请求上执行。您还可以做的是,将逻辑放在模块中,以便它在所有请求上执行,并让处理程序处理其他任何请求。
    • 好吧,因为我无法让模块方法工作,所以我尝试了处理程序,并且......它工作了!我的工作 web.config 看起来和你的一样(除了add 元素的nametype 属性值),我还在system.webServer 元素下有这个孩子:&lt;modules runAllManagedModulesForAllRequests="true"/&gt;。所以谢谢你的建议,我赞成你的回答。但是我仍然没有回答 OP,因为我敢打赌,无需添加更多不在 IIS 中的处理程序,仍然可以让仅模块方法工作。
    • 如果您有兴趣,可以在stackoverflow.com/a/35938562/1843329查看有关处理程序的更多详细信息
    猜你喜欢
    • 1970-01-01
    • 2018-12-20
    • 2015-06-13
    • 2013-10-10
    • 2014-06-22
    • 1970-01-01
    • 2016-03-08
    • 2017-10-16
    • 2019-10-28
    相关资源
    最近更新 更多