दिलचस्प पोस्ट

सभी * .aspx अनुरोधों को पकड़ने के लिए ASP.Net MVC मार्ग

यह पहले पूछा गया होगा , लेकिन यहां पढ़ने के बाद यहां , यहां और यहां मैं इसे काम करने के लिए प्रासंगिक भागों का एक्सट्रपलेशन नहीं कर सकता। मैं एक पुरानी वेब फ़ॉर्म साइट को एमवीसी में बदल रहा हूं और विशेष आवक HTTP अनुरोधों को पकड़ना चाहता हूं ताकि मैं एक RedirectPermanent जारी कर RedirectPermanent (हमारी Google रैंकिंग को सुरक्षित रखने और 404 के कारण उपयोगकर्ताओं को छोड़ने से)

सभी आने वाले अनुरोधों को अवरुद्ध करने या कुछ id मान के लिए पार्स करने के बजाय, मुझे .aspx फ़ाइल एक्सटेंशन में समाप्त होने वाले सभी अनुरोधों को रोकना होगा, उदा।

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

MVC मार्गों के लिए अनुरोधों को अनदेखा करना चाहिए (बस सामान्य रूप से संसाधित किया गया)।

ASPXFiles मार्ग को छोड़कर, जो अब तक मेरे पास है, वह ASPXFiles नहीं मारा जा रहा है।

 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 } ); } } 

}

क्या इस प्रकार का मार्ग एमवीसी में स्थापित करना संभव है?

Solutions Collecting From Web of "सभी * .aspx अनुरोधों को पकड़ने के लिए ASP.Net MVC मार्ग"

मैं MVC में 301 रीडायरेक्ट बनाने का सही तरीका दिखा रहा हूं, क्योंकि सभी ब्राउज़रों ने 301 पुनर्निर्देशित अनुरोधों को ठीक से जवाब नहीं दिया, और आपको एएसपी द्वारा उत्पन्न डिफ़ॉल्ट "ऑब्जेक्ट मोज" पेज की बजाय उपयोगकर्ता को एक विकल्प देने की आवश्यकता है नेट।

RedirectAspxPermanentRoute

हम एक कस्टम RouteBase उप- RouteBase निर्माण करते हैं जो पता लगाता है कि जब कोई यूआरएल .aspx साथ समाप्त हो जाता है और हमारे SystemController को रूट 301 रीडायरेक्ट सेटअप करने के लिए। इसके लिए आपको मूल्यों को रूट करने के लिए यूआरएल (मैच के यूआरएल) के मैप में प्रवेश करना होगा (जो कि एमवीसी यूआरएल जेनरेट करने के लिए उपयोग किया जाता है)।

 public class RedirectAspxPermanentRoute : RouteBase { private readonly IDictionary<string, object> urlMap; public RedirectAspxPermanentRoute(IDictionary<string, object> 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; } } 

ध्यान दें कि पहली जांच .aspx एक्सटेंशन के लिए है, इसलिए विस्तार तर्क से पूरी तरह से छोड़ा जाएगा यदि विस्तार मेल नहीं खाता है। यह आपके परिदृश्य के लिए सर्वश्रेष्ठ प्रदर्शन प्रदान करेगा

SystemController

हम SystemController को एक दृश्य वापस करने के लिए सेटअप करते हैं, जैसा कि हम सामान्य रूप से करेंगे यदि 301 की वजह से ब्राउज़र रीडायरेक्ट नहीं करता है, तो उपयोगकर्ता दृश्य देखेगा।

 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 string GetAbsoluteUrl(object routeValues) { var urlBuilder = new UriBuilder(Request.Url.AbsoluteUri) { Path = Url.RouteUrl(routeValues) }; var encodedAbsoluteUrl = urlBuilder.Uri.ToString(); return HttpUtility.UrlDecode(encodedAbsoluteUrl); } } 

Status301.cshtml

MVC के सम्मेलनों का पालन करें और इसे /Views/System/ फ़ोल्डर में रखें।

क्योंकि यह आपके 301 प्रतिक्रिया का एक दृश्य है, इसलिए आप इसे अपनी बाकी साइट के विषय से मेल कर सकते हैं। इसलिए, यदि उपयोगकर्ता यहां समाप्त होता है, तो यह अभी भी खराब अनुभव नहीं है।

दृश्य उपयोगकर्ता को स्वचालित रूप से जावास्क्रिप्ट के द्वारा और मेटा-रिफ्रेश के माध्यम से रीडायरेक्ट करने का प्रयास करेगा। इन दोनों को ब्राउज़र में बंद कर दिया जा सकता है, लेकिन संभावना यह है कि उपयोगकर्ता उसे वहां जाने के लिए कहें, जहां उन्हें जाना चाहिए। यदि नहीं, तो आपको उपयोगकर्ता को बताना चाहिए:

  1. पृष्ठ का एक नया स्थान है
  2. यदि उन्हें स्वत: रीडायरेक्ट नहीं किया गया है तो उन्हें लिंक पर क्लिक करना होगा।
  3. उन्हें अपने बुकमार्क को अपडेट करना चाहिए

 @{ ViewBag.Title = "Page Moved"; } @section MetaRefresh { <meta http-equiv="refresh" content="5;@ViewBag.DestinationUrl" /> } <h2 class="error">Page Moved</h2> <p> The page has moved. Click on the following URL if you are not redirected automatically in 5 seconds. Be sure to update your bookmarks. </p> <a href="@ViewBag.DestinationUrl">@ViewBag.DestinationUrl</a>. <script> //<!-- setTimeout(function () { window.location = "@ViewBag.DestinationUrl"; }, 5000); //--> </script> 

प्रयोग

सबसे पहले आपको अपने _Layout.cshtml कोई अनुभाग जोड़ने की आवश्यकता है, इसलिए मेटा-रीफ्रेश आपके पृष्ठ के मुख्य भाग में जोड़ा जा सकता है।

 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>@ViewBag.Title - My ASP.NET MVC Application</title> <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" /> <!-- Add this so the view can update this section --> @RenderSection("MetaRefresh", required: false) <meta name="viewport" content="width=device-width" /> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") </head> <!-- layout code omitted --> </html> 

फिर अपने रूटिंग कॉन्फ़िगरेशन पर RedirectAspxRoute रूट जोड़ें।

 public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.Add(new RedirectAspxPermanentRoute( new Dictionary<string, object>() { // 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 } ); } } 

इस तरह से कुछ प्रयास करें:

  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 } ); 

शुरू में मैं सुझाव दे रहा था और HTTPHandler लेकिन एएसपीएक्स विस्तार डिफ़ॉल्ट रूप से IIS में मैप किया जाता है और इसलिए काम नहीं करेगा। यहां जॉन गैलोवे के ब्लॉग पर एक लिंक है