如何使用ASP.Net MVC的路由我的路线的图像?(How do I route images u

2019-06-17 10:39发布

我升级我的网站从传统的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()方法?

Answer 1:

你不能做到这一点与MVC框架的“开箱即用”。 记得有路由和URL重写之间的差异。 路由映射每个请求的资源,和预期的资源是一段代码。

然而 - MVC框架的灵活性,可以让你没有真正的问题,做到这一点。 默认情况下,当你调用routes.MapRoute()它的处理请求与实例MvcRouteHandler() 你可以建立一个自定义的处理程序来处理图像的URL。

  1. 创建一个类,也可以叫做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 "";
        }
    }
}


Answer 2:

如果你做到这一点使用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
    }


文章来源: How do I route images using ASP.Net MVC routing?