2013-03-07 71 views
5

我已经为生成一个图像的ASP.NET MVC4网站编写了一个httpHandler。 ProcessRequest函数未被调用。任何想法为什么?为什么没有运行httphandler

MVC4,IIS Express中,Windows 8的临

的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> 

使用

<img src="/textimage/step1.png?q=Step 1&c=404040&w=30&h=250&z=12" /> 
+0

http://forums.asp.net/post/3416052.aspx – 2013-03-07 04:07:27

+0

好吧,谢谢你tmack的链接解释什么是httphandler。不幸的是,这与我的问题完全无关。 – 2013-03-07 04:22:19

+0

yyyyyyep。注意自我,停止浏览。 – 2013-03-07 04:33:45

回答

12

答案可以在网上找到如果一个人知道要寻找什么。

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

我选择使用example from Phil Haack

为了对抗环节腐,这是从文章

默认情况下的摘录,ASP.NET路由会忽略不 文件的请求存在于磁盘上。我在之前发布的 路由更改中解释了原因。长话短说,我们不希望路由到 尝试路由请求静态文件,如图像。 不幸的是,当我们想起ASP.NET的许多 功能请求.dd文件时,我们很头疼,它们不存在于 磁盘上。

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

routes.IgnoreRoute(“{resource} .axd/{* pathInfo}”);

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

{* path}。aspx/{* pathinfo}

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

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

我在做什么这里是一个 技术Eilon表明我这是映射所有网址,这些路线, 后来通过限制的约束 字典忽略的路由。因此,在这种情况下,这些路由将匹配(并因此忽略) 对favicon.ico的所有请求(不管是哪个目录)以及 对.aspx文件的请求。由于我们告诉路由忽略这些请求,所以会发生这些请求的正常ASP.NET处理。

+0

这应该被标记为答案。该文章有此更正“默认情况下,ASP.NET路由会忽略对磁盘上存在的文件的请求。” – 2013-06-19 15:50:30

0

上一个答案是正确的,但文章已从这里的摘录中编辑。忽略语句应为:

routes.IgnoreRoute("{*allaspx}", new {[email protected]".*\.aspx(/.*)?"}); 
routes.IgnoreRoute("{*favicon}", new {[email protected]"(.*/)?favicon.ico(/.*)?"}); 

请注意原始文件中缺少的{* allaspx}和{* favicon}字符串中的'*'。 我不能让它工作,直到我跟随链接,并按照更新的文章中的示例。

+0

弗兰克,谢谢你指出这一点。这篇文章没有编辑。我没有理解它,但是SO降价渲染器认为块引用中的'*'是格式化的,而不是内容。我已经逃脱了正确的符号,现在块引用的内容应该与原本的内容匹配 - 尽管现在块引用背后的“实际”内容与呈现内容不同 - 如果这样做有任何意义。 – 2015-04-01 01:26:41

相关问题