web-dev-qa-db-ja.com

ASP.Net MVCルーティングを使用して画像をルーティングするにはどうすればよいですか?

従来のASP.NetWebフォームからASP.NetMVCを使用するようにサイトをアップグレードしました。私は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()メソッドを使用するときの正しい構文は何ですか?

35
The Matt

MVCフレームワークでは、これを「箱から出して」行うことはできません。ルーティングとURL書き換えには違いがあることに注意してください。ルーティングはすべてのリクエストをリソースにマッピングすることであり、期待されるリソースはコードの一部です。

ただし、MVCフレームワークの柔軟性により、実際の問題なしにこれを実行できます。デフォルトでは、routes.MapRoute()を呼び出すと、MvcRouteHandler()のインスタンスでリクエストを処理します。 customハンドラーを作成して、画像のURLを処理できます。

  1. IRouteHandlerを実装するImageRouteHandlerと呼ばれるクラスを作成します。

  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 "";
        }
    }
}
51
womp

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
    }
6
awright18