我升级我的网站从传统的ASP.Net Web表单使用ASP.Net MVC。 我使用MVC路由重定向旧.aspx页到新的控制器/动作相当于请求:
routes.MapRoute(
"OldPage",
"oldpage.aspx",
new { controller = "NewController", action = "NewAction", id = "" }
);
这是对网页,因为他们直接映射到一个控制器和动作伟大的工作。 不过,我的问题是图像的请求 - 我不知道如何将这些传入的请求重定向。
我需要为传入的请求重定向http://www.domain.com/graphics/image.png到http://www.domain.com/content/images/image.png 。
什么是使用时的正确语法.MapRoute()
方法?
你不能做到这一点与MVC框架的“开箱即用”。 记得有路由和URL重写之间的差异。 路由映射每个请求的资源,和预期的资源是一段代码。
然而 - MVC框架的灵活性,可以让你没有真正的问题,做到这一点。 默认情况下,当你调用routes.MapRoute()
它的处理请求与实例MvcRouteHandler()
你可以建立一个自定义的处理程序来处理图像的URL。
创建一个类,也可以叫做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你必须创建一个实现IHttpHandler的处理响应一个单独的ImageHTTPHandler。 基本上所有你需要做的就是把那目前在GetHttpHandler方法到您的ImageHttpHandler的ProcessRequest方法的代码。 我也getContentType方法移入ImageHTTPHandler类。 还添加了一个变量来保存文件的名称。
然后你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("~/images/" + _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
}