Comment acheminer des images à l’aide du routage ASP.Net MVC?

J’ai mis à niveau mon site pour utiliser ASP.Net MVC à partir des formulaires Web ASP.Net traditionnels. J’utilise le routage MVC pour redirect les demandes d’anciennes pages .aspx vers leur nouvel équivalent contrôleur / action:

routes.MapRoute( "OldPage", "oldpage.aspx", new { controller = "NewController", action = "NewAction", id = "" } ); 

Cela fonctionne très bien pour les pages car elles correspondent directement à un contrôleur et à une action. Cependant, mon problème réside dans les demandes d’images. Je ne sais pas comment redirect ces demandes entrantes.

Je dois redirect les demandes entrantes pour http://soffr.miximages.com/c%23/image.png vers http://soffr.miximages.com/c%23/image.png .

Quelle est la syntaxe correcte lors de l’utilisation de la méthode .MapRoute() ?

Vous ne pouvez pas le faire “avec des outils” avec le framework MVC. N’oubliez pas qu’il existe une différence entre le routage et la réécriture d’URL. Le routage mappe chaque demande sur une ressource et la ressource attendue est un morceau de code.

Cependant – la flexibilité du framework MVC vous permet de le faire sans réel problème. Par défaut, lorsque vous appelez routes.MapRoute() , il traite la demande avec une instance de MvcRouteHandler() . Vous pouvez créer un gestionnaire personnalisé pour gérer vos URL d’image.

  1. Créez une classe, appelée peut-être ImageRouteHandler, qui implémente IRouteHandler .

  2. Ajoutez le mappage à votre application comme ceci:

    routes.Add("ImagesRoute", new Route("graphics/{filename}",
    new ImageRouteHandler()));

  3. C’est tout.

Voici à quoi ressemble votre classe 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) { ssortingng filename = requestContext.RouteData.Values["filename"] as ssortingng; if (ssortingng.IsNullOrEmpty(filename)) { // return a 404 HttpHandler here } else { requestContext.HttpContext.Response.Clear(); requestContext.HttpContext.Response.ContentType = GetContentType(requestContext.HttpContext.Request.Url.ToSsortingng()); // find physical path to image here. ssortingng filepath = requestContext.HttpContext.Server.MapPath("~/test.jpg"); requestContext.HttpContext.Response.WriteFile(filepath); requestContext.HttpContext.Response.End(); } return null; } private static ssortingng GetContentType(Ssortingng 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 ""; } } } 

Si vous utilisiez ASP.NET 3.5 Sp1 WebForms pour cela, vous devrez créer un ImageHTTPHandler distinct qui implémentera IHttpHandler pour gérer la réponse. Pour ce faire, il vous suffit de mettre le code actuellement dans la méthode GetHttpHandler dans la méthode ProcessRequest de votre ImageHttpHandler. Je voudrais également déplacer la méthode GetContentType dans la classe ImageHTTPHandler. Ajoutez également une variable pour contenir le nom du fichier.

Votre classe ImageRouteHanlder se présente alors comme suit:

 public class ImageRouteHandler:IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { ssortingng filename = requestContext.RouteData.Values["filename"] as ssortingng; return new ImageHttpHandler(filename); } } 

et votre classe ImageHttpHandler ressemblerait à ceci:

  public class ImageHttpHandler:IHttpHandler { private ssortingng _fileName; public ImageHttpHandler(ssortingng filename) { _fileName = filename; } #region IHttpHandler Members public bool IsReusable { get { throw new NotImplementedException(); } } public void ProcessRequest(HttpContext context) { if (ssortingng.IsNullOrEmpty(_fileName)) { context.Response.Clear(); context.Response.StatusCode = 404; context.Response.End(); } else { context.Response.Clear(); context.Response.ContentType = GetContentType(context.Request.Url.ToSsortingng()); // find physical path to image here. ssortingng filepath = context.Server.MapPath("~/images/" + _fileName); context.Response.WriteFile(filepath); context.Response.End(); } } private static ssortingng GetContentType(Ssortingng 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 }