如何限制对 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 片段中指定了类型声明。
我的 asp.net 网络项目中有几个 http 处理程序 (IHttpHandler
)。现在我想限制对这些处理程序的访问。对于 Handler1,我只想允许 POST 请求,对于 Handler2,我只想允许 GET 请求。
在我的 web.config
中,我修改了
<httpHandlers>
<add verb="POST" path="Handler1.ashx" type="MyNamesapce.Handler1, MyAssembly"/>
<add verb="GET" path="Handler2.ashx" type="MyNamesapce.Handler2, MyAssembly"/>
</httpHandlers>
这对您不起作用的原因是您将实现 IHttpHandler
.
有两种方法可以实现 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 片段中指定了类型声明。