为什么httphandler没有运行

Sam*_*Axe 5 asp.net-mvc httphandler iis-express asp.net-mvc-4

我为ASP.NET MVC4站点编写了一个生成图像的httpHandler.该ProcessRequest函数未被调用.有什么想法吗?

MVC4,IIS Express,Windows 8 Pro

Web.config> system.webServer

 <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="TextImage" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
      <add name="TextImage" path="textimage/*.png" verb="*" resourceType="Unspecified" type="MultiStepUI.TextImageHandler, MultiStepUI_MOBETTER" />
    </handlers>
  </system.webServer>
Run Code Online (Sandbox Code Playgroud)

用法

<img src="/textimage/step1.png?q=Step 1&c=404040&w=30&h=250&z=12" />
Run Code Online (Sandbox Code Playgroud)

Sam*_*Axe 13

如果有人知道要查找什么,可以在网上找到答案.

MVC路由引擎尝试将所有请求映射到控制器 - 在这种情况下,这不是我们想要的.除了在Web.config中注册处理程序之外,我们还需要告诉MVC路由引擎忽略httpHandler,path以便ASP.NET引擎可以处理它的路由.

我选择使用Phil Haack例子

为了对抗链接腐烂,这是文章的摘录

默认情况下,ASP.NET路由忽略对磁盘上不存在的文件的请求.我在之前关于即将发生的路由更改的帖子中解释了这个原因.长话短说,我们不希望路由尝试路由请求静态文件,如图像.不幸的是,当我们记得ASP.NET的许多功能都要求磁盘上不存在的.axd文件时,这让我们头疼.

为了解决这个问题,我们包括在RouteCollection,IgnoreRoute,创建一个路由映射到StopRoutingHandler路由处理(类实现IRouteHandler)的新扩展方法.实际上,路由将忽略与"忽略路由"匹配的任何请求,并且将基于现有的http处理程序映射进行正常的ASP.NET处理.因此,在我们的默认模板中,您会注意到我们定义了以下路径.

routes.IgnoreRoute( "{}资源个.axd/{*} PATHINFO");

这会处理标准的.axd请求.但是,在其他情况下,您可能会请求磁盘上不存在的文件.例如,如果将HTTP Handler直接注册到实现IHttpHandler的类型.更不用说浏览器自动生成的favicon.ico请求.ASP.NET路由尝试将这些请求路由到控制器.对此的一个解决方案是添加适当的忽略路由以指示路由应忽略这些请求.不幸的是,我们做不到这样的事情:

{*}路径的.aspx/{*} PATHINFO

我们只允许一个catch-all路由,它必须发生在URL的末尾.但是,您可以采取以下方法.在这个例子中,我添加了以下两个路由.

routes.IgnoreRoute("{*allaspx}",new {allaspx = @".*\.aspx(/.*)?"});
routes.IgnoreRoute("{*favicon}",new {favicon = @"(.*/)?favicon.ico(/.*)?"});

我在这里做的是Eilon向我展示的一种技术,即将所有URL映射到这些路由,然后通过约束字典限制忽略哪些路由.因此,在这种情况下,这些路由将匹配(并因此忽略)对favicon.ico的所有请求(无论哪个目录)以及对.aspx文件的请求.由于我们告诉路由忽略这些请求,因此将发生这些请求的正常ASP.NET处理.