我的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>
答案 0 :(得分:3)
这对你不起作用的原因是你已经把两种略有不同的口味混合在一起了#34;实现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
中看到此配置。搜索&#34; .ashx&#34;并且您会在<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&#34;回复任何以.ashx
结尾的网址通过使用类型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" />
注意:我为测试它而创建的项目名为&#34; HttpHandlers&#34;,因此我在该web.config片段中指定了类型声明。