【问题标题】:httphandler doesn't engage for non-home pageshttphandler 不参与非主页
【发布时间】:2011-01-22 14:02:01
【问题描述】:

我有一个 MVC2 应用程序和 HttpHandler 库。为简化起见,该库提供图像。问题是,如果我从根页面 (http://whatever/) 调用此处理程序,一切正常。但是,如果我更改 Global.asax,则同一页面现在的地址为 http://whatever/controller/action - 它不起作用(出现 ALT 文本而不是图像)。

处理程序库不是我写的,但我有代码;所以我在 IHttpHandler 实现的 ProcessRequest 函数中放了一个断点。对于 good 情况,断点会被触发,但对于 bad 情况则不会。因此,我假设不会为非根页面调用处理程序。

这是我在 system.webServer/handlers 部分的内容:

<add name="ImageHandler" verb="*" 
              path="ImageLib.axd" type="ImageHandler, ImageHandler" />

查看页面有

<img src="ImageLib.axd?image=img001.jpg" alt="real image here" />

我不知道 MVC 是否在其中扮演任何角色……旧的 WebForms 应用程序在相同的设置下也能正常工作。

希望我提供了我所知道的一切。当然,如果有什么不清楚的地方,我很乐意尽我所能解释!

【问题讨论】:

    标签: asp.net asp.net-mvc httphandler


    【解决方案1】:

    试试这个:

    <img src="/ImageLib.axd?image=img001.jpg" alt="real image here" />
    

    根本问题是您相对引用 ImageLib.axd。浏览器将尝试从任何地方访问它......在你的情况下,当它请求图像时,它是从http://whatever/controller/action/ImageLib.axd 请求它。我假设您需要它向http://whatever/ImageLib.axd 请求。

    请注意,简单地添加前面的重击 (/) 不一定能解决您的问题。如果 ImageLib.axd 位于根目录之外的某个子文件夹中,则必须包含它。如果您的 ImageLib.axd 处理程序位于您的网站根目录下名为 handlers 的文件夹中,您将执行以下操作:

    <img src="/Handlers/ImageLib.axd?image=img001.jpg" alt="real image here" />
    

    【讨论】:

    • 好的,只需添加前面的斜线 did 就可以了。我不确定第二部分 - 我没有物理 Image.axd。我认为 Image.axd 映射到 ImageHandler,它包含在 ImageUtil.dll 中,作为参考。我想,它暗示在根中;因此斜线解决了这个问题。非常感谢!
    • 啊,是的,并不是所有的 .axd 处理程序都有一个实际的 .axd 文件……这取决于实现。很高兴解决方案奏效。 :)
    【解决方案2】:

    您需要将图像请求路由到您的 httpHandler,但 mvc 正在拦截请求并尝试路由到控制器操作。

    您可以在 Global.asax 中配置它,或者如果您在 OnStart() 方法上实现自己的 HttpApplication,如下所示:

    routes.IgnoreRoute("{*allaxd}", new {allaxd=@".*\.axd(/.*)?"});
    // or make sure you have this 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    

    您可以在此处http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspxhttp://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx找到有关 Phil Haack 帖子的更多信息

    【讨论】:

    • Dax70,谢谢你的建议。我有这条线(我猜,它是在生成 MVC 项目时放在 RegisterRoutes() 中的)。另外,我不确定这个建议如何适用于我的情况 - 因为我确实为根页面调用了 httphandler。
    猜你喜欢
    • 2010-12-30
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多