2010-03-02 31 views
0

我有一个MVC2应用程序和HttpHandler库。图书馆,为了简化,为图片提供服务。问题是,如果我从根页面(http://whatever/)调用这个处理程序,一切工作正常。但是,如果我更改Global.asax,那么同一页现在的地址为http://whatever/controller/action - 它不起作用(ALT文本出现而不是图像)。httphandler不参与非主页

我没有写处理程序库,但我有代码;所以我在IHttpHandler实现的ProcessRequest函数中放置了一个断点。对于不错情况下断点被触发,但对于不好的情况不是。所以,我认为这个处理程序没有为非根页面调用。

这是我在system.webServer /处理器部分:

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

视图页面有

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

我不知道,如果MVC中它起到什么作用?旧的WebForms应用程序可以使用相同的设置正常工作。

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

回答

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处理程序是一个文件夹,名为处理程序关闭您的网站的根目录,你会做以下几点:

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

好吧,只需添加前面的斜线*做*工作。我不确定第二部分 - 我没有物理Image.axd。我认为Image.axd被映射到ImageHandler,该ImageHtiller包含在作为参考包含的ImageUtil.dll中。我想,这意味着在根本上;因此斜线解决了这个问题。 非常感谢! – Felix 2010-03-02 04:39:28

+0

啊,是的,不是所有的.axd处理程序都有一个实际的.axd文件......有些取决于实现。很高兴解决方案工作。 :) – jrista 2010-03-02 04:40:46

1

您需要路线图像请求您的HttpHandler,但MVC是为拦截请求并尝试路由到控制器操作。

您可以在Global.asax中配置此或者如果你在的OnStart()方法实现自己的HttpApplication如下:

routes.IgnoreRoute("{*allaxd}", new {[email protected]".*\.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.aspx

+0

Dax70,谢谢你的建议。我有这条线(我猜,当生成MVC项目时,它将放入RegisterRoutes()中)。另外,我不确定这个建议是如何应用于我的情况的 - 因为我*会*为根页面调用httphandler。 – Felix 2010-03-02 05:00:56