如何限制对HttpHandler的POST访问

本文关键字:POST 访问 HttpHandler 何限制 | 更新日期: 2023-09-27 18:20:57

我的asp.net web项目中有一些http处理程序(IHttpHandler)。现在我想限制对这些处理程序的访问。对于Handler1,我希望只允许POST请求,而对于Handler2,我希望仅允许GET请求。

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

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

如何限制对HttpHandler的POST访问

这对您不起作用的原因是您将实现IHttpHandler的东西的两种略有不同的"风格"混为一谈。

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

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

第一种类型需要web.config文件中的条目才能工作,而第二种则不然。这就是为什么您会看到.ashx处理程序响应所有HTTP谓词,因为它们是由asp.net框架中响应.ashx文件请求的部分处理的,而不是由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"通过使用类型为System.Web.UI.SimpleHandlerFactory的代码来处理以.ashx结尾的任何包含列出的谓词的URL。然后,此代码加载您的.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代码段中指定了类型声明。