这对您不起作用的原因是您将实现 IHttpHandler 的东西的两种略有不同的“风味”混为一谈。
有两种方法可以用 asp.net 实现 IHttpHandler:
- 创建一个实现
IHttpHandler的类,例如MyCustomHandler.cs。这种类型的处理程序不会响应任何请求,除非您在 web.config 文件中进行配置。
- 创建一个
.ashx 文件(看起来你已经完成了),例如MyOtherHandler.ashx。这种类型的处理程序将响应对其 URL 的任何请求,例如http://localhost/MyOtherHandler.ashx
第一种类型需要 web.config 文件中的条目才能工作,第二种不需要。这就是为什么您会看到 .ashx 处理程序响应所有 HTTP 动词的原因,因为它们是由响应 .ashx 文件请求的 asp.net 框架的一部分处理的,而不是由您的 Web 触发的。配置文件。如果您使用的是 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“使用列出的任何动词响应以 .ashx 结尾的任何 URL,方法是使用代码在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 sn-p 中指定了类型声明。