Route ASP.Net MVC pour intercepter toutes les requêtes * .aspx

Cela a dû être demandé auparavant, mais après avoir lu ici , ici , ici et ici, je ne peux pas extrapoler les parties pertinentes pour que cela fonctionne. Je suis en train de réorganiser un ancien site de formulaires Web dans MVC et je souhaite intercepter des requêtes HTTP entrantes particulières afin de pouvoir émettre un RedirectPermanent (pour protéger notre classement Google et éviter que des utilisateurs ne partent en raison de 404).

Plutôt que d’intercepter toutes les requêtes entrantes ou d’parsingr une valeur id , je dois intercepter toutes les requêtes qui se terminent par (ou contiennent) l’extension de fichier .aspx , par exemple

 www.sample.com/default.aspx www.sample.com/somedir/file.aspx www.sample.com/somedir/file.aspx?foo=bar 

Les demandes aux routes MVC doivent être ignorées (traitées normalement).

Voici ce que j’ai jusqu’à présent, sauf que la route ASPXFiles n’est jamais touchée.

 public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // never generates a match routes.MapRoute( name: "ASPXFiles", url: "*.aspx", defaults: new { controller = "ASPXFiles", action = "Index" } ); // Used to process all other requests (works fine) routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } 

}

Ce type d’itinéraire est-il possible de s’installer dans MVC?

Je montre le bon moyen d’effectuer une redirection 301 dans MVC, car tous les navigateurs ne répondent pas correctement aux demandes de redirection 301 et vous devez donner à l’utilisateur la possibilité de continuer plutôt que la page par défaut “Objet déplacé” générée par ASP. .NET.

RedirectAspxPermanentRoute

Nous construisons une sous-classe RouteBase personnalisée qui détecte le moment où une URL se termine par .aspx et les route vers notre SystemController pour configurer la redirection 301. Vous devez transmettre une mappe d’URL (l’URL à faire correspondre) pour acheminer des valeurs (utilisées pour générer l’URL MVC).

 public class RedirectAspxPermanentRoute : RouteBase { private readonly IDictionary urlMap; public RedirectAspxPermanentRoute(IDictionary urlMap) { if (urlMap == null) throw new ArgumentNullException("urlMap"); this.urlMap = urlMap; } public override RouteData GetRouteData(HttpContextBase httpContext) { var path = httpContext.Request.Path; if (path.EndsWith(".aspx")) { if (!urlMap.ContainsKey(path)) return null; var routeValues = urlMap[path]; var routeData = new RouteData(this, new MvcRouteHandler()); routeData.Values["controller"] = "System"; routeData.Values["action"] = "Status301"; routeData.DataTokens["routeValues"] = routeValues; return routeData; } return null; } public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { return null; } } 

Notez que la première vérification concerne l’extension .aspx , de sorte que le rest de la logique sera entièrement ignoré si l’extension ne correspond pas. Cela fournira la meilleure performance pour votre scénario.

SystemController

Nous avons configuré SystemController pour qu’il retourne une vue comme nous le ferions normalement. Si le navigateur ne redirige pas à cause du 301, l’utilisateur verra la vue.

 using System; using System.Net; using System.Web; using System.Web.Mvc; public class SystemController : Controller { // // GET: /System/Status301/ public ActionResult Status301() { var routeValues = this.Request.RequestContext.RouteData.DataTokens["routeValues"]; var url = this.GetAbsoluteUrl(routeValues); Response.CacheControl = "no-cache"; Response.StatusCode = (int)HttpStatusCode.MovedPermanently; Response.RedirectLocation = url; ViewBag.DestinationUrl = url; return View(); } private ssortingng GetAbsoluteUrl(object routeValues) { var urlBuilder = new UriBuilder(Request.Url.AbsoluteUri) { Path = Url.RouteUrl(routeValues) }; var encodedAbsoluteUrl = urlBuilder.Uri.ToSsortingng(); return HttpUtility.UrlDecode(encodedAbsoluteUrl); } } 

Status301.cshtml

Suivez les conventions de MVC et assurez-vous de le placer dans le dossier /Views/System/ .

Comme il s’agit d’une vue pour votre réponse 301, vous pouvez l’adapter au thème du rest de votre site. Donc, si l’utilisateur se retrouve ici, ce n’est pas une mauvaise expérience.

La vue tentera de redirect l’utilisateur automatiquement via JavaScript et via Meta-Refresh. Ces deux options peuvent être désactivées dans le navigateur, mais il est probable que l’utilisateur parviendra à la position souhaitée. Sinon, vous devriez dire à l’utilisateur:

  1. La page a un nouvel emplacement.
  2. Ils doivent cliquer sur le lien s’ils ne sont pas automatiquement redirigés.
  3. Ils devraient mettre à jour leur signet.

 @{ ViewBag.Title = "Page Moved"; } @section MetaRefresh {  } 

Page Moved

The page has moved. Click on the following URL if you are not redirected automatically in 5 seconds. Be sure to update your bookmarks.

https://stackoverflow.com/questions/36156496/asp-net-mvc-route-to-catch-all-aspx-requests/@ViewBag.DestinationUrl.

Usage

Vous devez d’abord append une section à votre _Layout.cshtml afin que la méta-actualisation puisse être ajoutée à la section d’en-tête de votre page.

 < !DOCTYPE html>    @ViewBag.Title - My ASP.NET MVC Application   @RenderSection("MetaRefresh", required: false)  @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr")    

Ajoutez ensuite le RedirectAspxRoute à votre configuration de routage.

 public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.Add(new RedirectAspxPermanentRoute( new Dictionary() { // Old URL on the left, new route values on the right. { @"/about-us.aspx", new { controller = "Home", action = "About" } }, { @"/contact-us.aspx", new { controller = "Home", action = "Contact" } } }) ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } 

Essayez quelque chose comme ça:

  routes.MapRoute( name: "ASPXFilesWithFolderPath", url: "{folder}/{page}.aspx", defaults: new { controller = "ASPXFiles", action = "Index", folder=UrlParameter.Optional, page = UrlParameter.Optional } ); routes.MapRoute( name: "ASPXFiles", url: "{page}.aspx", defaults: new { controller = "ASPXFiles", action = "Index", page = UrlParameter.Optional } ); 

Au départ, j’allais suggérer HTTPHandler, mais l’extension aspx est mappée dans IIS par défaut et ne fonctionnera donc pas. Voici un lien vers le blog de Jon Galloway