6

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

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" />
4

2 回答 2

15

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

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

我选择使用Phil Haack 的示例

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

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

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

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

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

{*path}.aspx/{*pathinfo}

我们只允许一个包罗万象的路由,它必须发生在 URL 的末尾。但是,您可以采取以下方法。在此示例中,我添加了以下两条路线。

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

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

于 2013-03-07T19:01:26.160 回答
0

前面的答案是正确的,但文章已从此处放置的摘录中进行了编辑。忽略语句应为:

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

请注意原始中缺少的 {*allaspx} 和 {*favicon} 字符串中的“*”。在我点击链接并按照更新文章中的示例进行操作之前,我无法让它工作。

于 2014-07-23T08:16:03.867 回答