如何限制对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>
这对您不起作用的原因是您将实现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代码段中指定了类型声明。