【问题标题】:why is the httphandler not running为什么httphandler没有运行
【发布时间】:2013-03-07 01:16:31
【问题描述】:

我为一个生成图像的 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" />

【问题讨论】:

  • 好吧,谢谢 tmack 提供的链接,它解释了什么是 httphandler。不幸的是,这与我的问题完全无关。
  • yyyyyep。提醒自己,停止浏览。
  • 嘿。这一个很好的读物。谢谢。

标签: asp.net-mvc asp.net-mvc-4 httphandler iis-express


【解决方案1】:

只要知道要寻找什么,就可以在网上找到答案。

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

我选择使用example from Phil Haack

为了防止链接失效,这是文章的摘录

默认情况下,ASP.NET Routing 会忽略对不符合要求的文件的请求 存在于磁盘上。我在之前的帖子中解释了这个原因 即将发生的路由更改。长话短说,我们不想路由到 尝试路由对静态文件(例如图像)的请求。 不幸的是,当我们想起许多 ASP.NET 的功能对不存在的 .axd 文件提出请求 磁盘。

为了解决这个问题,我们在 RouteCollection,IgnoreRoute,创建一个映射到 StopRoutingHandler 路由处理程序(实现的类 IRouteHandler)。实际上,任何匹配“忽略 route”将被路由忽略,正常的 ASP.NET 处理将 基于现有的 http 处理程序映射发生。因此在我们的默认 模板,你会注意到我们定义了以下路由。

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

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

{*path}.aspx/{*pathinfo}

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

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

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

【讨论】:

  • 这应该被标记为答案。这篇文章有这样的更正“默认情况下,ASP.NET 路由忽略对磁盘上确实存在的文件的请求。”
【解决方案2】:

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

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

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

【讨论】:

  • 弗兰克,感谢您指出这一点。文章没有编辑。我没听明白,但是 SO markdown 渲染器认为块引用中的 *s 是格式化的,而不是内容。我已经转义了正确的符号,现在块引用的内容应该与预期的内容相匹配 - 即使现在块引用后面的“实际”内容与呈现的内容不同......如果这有任何意义的话。跨度>
猜你喜欢
  • 2023-03-22
  • 2015-10-16
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2021-08-04
相关资源
最近更新 更多