如何限制对 HttpHandler 的 POST 访问?

How do I restrict POST access to a HttpHandler?

我的 asp.net 网络项目中有几个 http 处理程序 (IHttpHandler)。现在我想限制对这些处理程序的访问。对于 Handler1,我只想允许 POST 请求,对于 Handler2,我只想允许 GET 请求。

在我的 web.config 中,我修改了 部分,如下所示,但两个处理程序仍然处理所有动词类型​​。我错过了什么吗?我正在使用 IIS Express 对其进行测试。

<httpHandlers>
  <add verb="POST" path="Handler1.ashx" type="MyNamesapce.Handler1, MyAssembly"/>
  <add verb="GET" path="Handler2.ashx" type="MyNamesapce.Handler2, MyAssembly"/>
</httpHandlers>

这对您不起作用的原因是您将实现 IHttpHandler.

的两个略有不同的 "flavours" 混为一谈

有两种方法可以实现 IHttpHandler asp.net:

  • 创建一个实现 IHttpHandler 的 class,例如MyCustomHandler.cs。如果未在您的 web.config 文件中配置,此类处理程序将不会响应任何请求。
  • 创建一个 .ashx 文件(看起来您已经完成了),例如MyOtherHandler.ashx。这种类型的处理程序将响应对其 URL 的任何请求,例如http://localhost/MyOtherHandler.ashx

第一种类型需要 web.config 文件中的条目才能工作,第二种则不需要。这就是为什么您看到 .ashx 处理程序响应所有 HTTP 动词的原因,因为它们由响应 .ashx 文件请求的 asp.net 框架的一部分处理,而不是被触发通过您的 web.config 文件。如果您使用的是 IIS Express,您可以在文件 %USERPROFILE%\Documents\IISExpress\config\applicationhost.config 中看到此配置。搜索“.ashx”,您会在 <system.webServer><handlers> 部分找到类似于以下内容的一行:

<add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx"
     verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" 
     preCondition="integratedMode,runtimeVersionv4.0" />

这等同于您添加到 web.config 的内容,但负责告诉 IIS/asp.net“响应任何以 [= 结尾的 URL” 16=] 与任何列出的动词,通过类型 System.Web.UI.SimpleHandlerFactory 中的代码处理它。此代码然后加载您的 .ashx 文件。

要创建一个可以响应您选择的任何地址的处理程序,您需要(简而言之)一个包含类似于以下内容的 .cs 文件:

using System.Web;

namespace HttpHandlers
{
    public class Handler4 : IHttpHandler
    {
        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Write("Hello World from Handler4.cs");
        }
    }
}

然后您可以将它连接到您的 web.config 文件中:

<add name="Handler4" verb="POST" path="Handler4.ashx" type="HttpHandlers.Handler4, HttpHandlers" />

注意:我创建的用于测试此项目的项目称为 "HttpHandlers",因此我在该 web.config 片段中指定了类型声明。