asp.net mvc 2.0:路由请求到静态资源

时间:2011-01-17 18:36:49

标签: asp.net-mvc-2 iis-7 httphandler

我想将HTTP请求路由到某个操作,而不是路由到文件。

重要说明确实使用IIS 7.0 URL重写模块的工作解决方案,但是在家中进行调试(没有IIS 7.0)我无法使用URL重写。

具体情况
我想将包含/images/的任何网址指向~/images/文件夹。

示例:

http://wowreforge.com/images/a.png -> /images/a.png
http://wowreforge.com/Emerald Dream/Jizi/images/a.png -> /images/a.png
http://wowreforge.com/US/Emerald Dream/Jizi/images/a.png -> /images/a.png
http://wowreforge.com/characters/view/images/a.png -> /images/a.png

问题源于页面“view_character.aspx”可以从多个URL到达:

http://wowreforge.com/?name=jizi&reaml=Emerald Dream
http://wowreforge.com/US/Emerald Dream/Jizi

上下文 IIS 7.0(集成模式),ASP.NET MVC 2.0

额外学分问题

  • 在这种情况下使用ASP.NET MVC路由而不是URL重写是不是一个坏主意?
  • IIS 7.0将请求路由到物理文件的处理程序是什么?

1 个答案:

答案 0 :(得分:3)

您可能应该将图片链接重写为。

<img src="<%= ResolveUrl("~/images/a.png") %>" />

这样您就不需要让路线处理图像了。

<强>更新 你将如何通过路由来做到这一点 将此条目添加到您的RouteTable

routes.Add("images", new Route("{*path}", null, 
   new RouteValueDictionary(new { path = ".*/images/.*"}), 
   new ImageRouteHandler()));

现在您需要创建一个ImageRouteHandler和一个ImageHandler

public class ImageRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        //you'll need to figure out how to get the physical path
        return new ImageHandler(/* get physical path */);
    }
}

public class ImageHandler : IHttpHandler
{
    public string PhysicalPath { get; set; }

    public ImageHandler(string physicalPath)
    {
        PhysicalPath = physicalPath;
    }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.TransmitFile(PhysicalPath);
    }

    public bool IsReusable
    {
        get { return true; }
    }
}

这也不做任何缓存。您可以在Reflector中查看System.Web.StaticFileHandler,以获取处理Asp.Net应用程序静态文件的处理程序,以实现更完整的实现。