従来の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()
メソッドを使用するときの正しい構文は何ですか?
MVCフレームワークでは、これを「箱から出して」行うことはできません。ルーティングとURL書き換えには違いがあることに注意してください。ルーティングはすべてのリクエストをリソースにマッピングすることであり、期待されるリソースはコードの一部です。
ただし、MVCフレームワークの柔軟性により、実際の問題なしにこれを実行できます。デフォルトでは、routes.MapRoute()
を呼び出すと、MvcRouteHandler()
のインスタンスでリクエストを処理します。 customハンドラーを作成して、画像のURLを処理できます。
IRouteHandler
を実装するImageRouteHandlerと呼ばれるクラスを作成します。
次のようにアプリにマッピングを追加します。
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
}