2010-01-05 6 views
9

मुझे साइटमैपएक्शन रिसेट मिला है जो एक्शन रिसेट को ओवरराइड करता है, और http://www.sprelle.no/Home/SiteMap हिट होने पर एक एसईओ sitemap.xml प्रदान करता है। अब तक सब ठीक है।एमवीसी: एक actionResult के लिए /sitemap.xml मार्ग कैसे करें?

मैं क्या चाहूंगा, साइटमैप.एक्सएमएल की सेवा करना है जब Google /sitemap.xml पर जाता है। इसके लिए काम करने के लिए, मुझे एक रूट चाहिए जो "sitemap.xml" देखता है और/होम/साइटमैप पर निर्देशित करता है।

मैं इस मानचित्रण (रूट तालिका में) कैसे बना सकता हूं?

उत्तर

14

के लिए एक मानचित्र जोड़ें:

routes.MapRoute(
      "Sitemap", 
      "sitemap.xml", 
      new { controller = "Home", action = "SiteMap" } 
      ); 

सूचना है कि मार्ग, नियंत्रक, और कार्रवाई के लिए विकल्पों कठिन कोडित रहे हैं।

+7

मैं वास्तव में इस आज पहले की कोशिश की, लेकिन क्योंकि मैं डिफ़ॉल्ट मार्ग _after_ मार्ग कहा कि यह काम करने के लिए नहीं मिल सका। इसे काम करने के लिए डिफ़ॉल्ट मार्ग _before_ डालने की आवश्यकता है। धन्यवाद। – HaakonL

+12

system.web सर्वर के अंदर अपने मॉड्यूल कॉन्फ़िगरेशन के लिए runAllManagedModulesForAllRequests = "true" को भी याद रखना याद रखें, अन्यथा यह staticfile हैंडलर का उपयोग करने का प्रयास करेगा और यह 404 –

+0

@RaulVejar वापस आ जाएगा! मैं एक घंटे से अधिक समय तक इंटरनेट खोज रहा हूं और आप मॉड्यूल टुकड़े का उल्लेख करने वाले पहले व्यक्ति हैं। यह मेरी समस्या हल हो गया। – ddilsaver

6

आप इसका उपयोग कर सकते हैं।

चरण 1. का उपयोग करता है 7 एकीकृत मोड TransferRequestHandler को फाइल एक्सटेंशन का मिलान

आईआईएस HTTP हैंडलर मैपिंग एक HTTP हैंडलर के लिए जो बिंदु पथ/क्रिया संयोजन। उदाहरण के लिए, एक डिफ़ॉल्ट हैंडलर मैपिंग है जो साइट के चल रहे .NET रनटाइम संस्करण के लिए उपयुक्त ISAPI मॉड्यूल के लिए पथ = "*। Axd" verb = "GET, HEAD, POST, DEBUG" को इंगित करता है। आईआईएस एक्सप्रेस के तहत डिफ़ॉल्ट हैंडलर देखने का सबसे आसान तरीका आईआईएस एक्सप्रेस के तहत एक साइट चलाने के लिए है, सिस्टम ट्रे में आईआईएस एक्सप्रेस आइकन पर राइट-क्लिक करें, "सभी एप्लिकेशन दिखाएं" पर क्लिक करें, और साइट पर क्लिक करें। नीचे दिए गए applicationhost.config लिंक को लिंक किया गया है, इसलिए आप बस उस पर क्लिक कर सकते हैं और इसे विजुअल स्टूडियो में लोड करना चाहिए।

यदि आप नीचे स्क्रॉल करते हैं, तो आप देखेंगे कि path="*" verb="*" के लिए एक कैचल स्टेटिकफ़ाइल मानचित्रण है जो StaticFileModule,DefaultDocumentModule,DirectoryListingModule पर इंगित करता है। यदि आप कुछ भी नहीं करते हैं तो यही आपके .html अनुरोध को संभालेगा। तो पहला कदम अपने web.config में एक हैंडलर जोड़ना है जो TransferRequestHandler पर अनुरोध करेगा। TransferRequestHandler वह हैंडलर है जो एमवीसी मार्गों में देखने के लिए उपयोग किए जाने वाले विस्तारित यूआरएल का ख्याल रखता है, उदाहरण के लिए /store/details/5

हैंडलर मैपिंग जोड़ना वास्तव में आसान है - बस अपना web.config खोलें और इसे <system.webServer/handlers> नोड में जोड़ें।

<add name="HtmlFileHandler" path="*.html" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 

ध्यान दें कि यदि आप चाहें तो पथ को अधिक विशिष्ट बना सकते हैं। उदाहरण के लिए, यदि आप केवल एक विशेष अनुरोध रोकना चाहता था, आप पथ = "sample.html"

चरण 2. इस्तेमाल कर सकते हैं मार्ग

अगला विन्यास, आप एक नया मार्ग की आवश्यकता होगी। App_Start/RouteConfig.cs खोलें और इसे RegisterRoutes कॉल पर खोलें। मेरा पूरा RegisterRoutes इस तरह दिखता है:

routes.MapRoute(
     name: "XMLPath", 
     url: "sitemapindex.xml", 
     defaults: new { controller = "Home", action = "Html", page = UrlParameter.Optional } 
    ); 

चरण 3. मार्ग मौजूदा फ़ाइलों

यह लगभग यह शामिल किया गया है, लेकिन वहाँ की देखभाल करने के एक और बात है - अधिभावी अनुरोध करता है कि किसी मौजूदा फ़ाइल से मेल खाते हैं। अगर आपके पास myfile.html नामक एक वास्तविक फ़ाइल है, तो रूटिंग सिस्टम आपके मार्ग को चलाने की अनुमति नहीं देगा। मैं इसके बारे में भूल गया, एक HTTP 500 त्रुटि (रिकर्सन ओवरफ्लो) के साथ समाप्त हुआ और मदद के लिए एइलॉन लिपटन से पूछना पड़ा।

वैसे भी, यह ठीक करना आसान है - बस मार्ग जोड़ें। रूटएक्सस्टिंगफाइल = अपने मार्ग पंजीकरण के लिए सच है। मेरा पूरा रजिस्टर रूट कॉल इस तरह दिखता है:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.RouteExistingFiles = true; 

     routes.MapRoute(
      name: "CrazyPants", 
      url: "{page}.html", 
      defaults: new { controller = "Home", action = "Html", page = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 
    } 

यही है।

मैं इस नियंत्रक कार्रवाई जोड़कर परीक्षण किया:

public FileResult Html() 
{ 
    var stringBuilder = new StringBuilder(); 
    stringBuilder.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); 
    stringBuilder.AppendLine("<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">"); 
    stringBuilder.AppendLine("<sitemap>"); 
    stringBuilder.AppendLine("<loc>http://sprint-newhomes.move.com/sitemaps/sitemap_01.xml</loc>"); 
    stringBuilder.AppendLine("<lastmod>" + DateTime.Now.ToString("MMMM-dd-yyyy HH:mm:ss tt") + "</lastmod>"); 
    stringBuilder.AppendLine("</sitemap>"); 
    stringBuilder.AppendLine("<sitemap>"); 
    stringBuilder.AppendLine("<loc>http://sprint-newhomes.move.com/sitemaps/sitemap_02.xml</loc>"); 
    stringBuilder.AppendLine("<lastmod>" + DateTime.Now.ToString("MMMM-dd-yyyy HH:mm:ss tt") + "</lastmod>"); 
    stringBuilder.AppendLine("</sitemap>"); 
    stringBuilder.AppendLine("</sitemapindex>"); 

    var ms = new MemoryStream(Encoding.ASCII.GetBytes(stringBuilder.ToString())); 



    Response.AppendHeader("Content-Disposition", "inline;filename=sitemapindex.xml"); 
    return new FileStreamResult(ms, "text/xml"); 
} 
+0

हालांकि यह उत्तर सही हो सकता है, लेकिन यहां प्रासंगिक कोड शामिल करना बेहतर होगा। यदि वेबसाइट चलती है या हटा दी जाती है तो लिंक-केवल उत्तर गलत हो सकते हैं। – Jonathan

0

प्राप्त करने के लिए इस आप 2 बातें करने की जरूरत है काम करने के लिए:

  1. आईआईएस निर्देश दें स्थिर फ़ाइल अनुरोध को अनुमति देना "/साइटमैप .xml "अपने नियंत्रक को हिट करने के लिए। अन्यथा आईआईएस आपके आवेदन को बाईपास करेगा और इस नाम के साथ सीधे फाइल के लिए देखेंगे। अपने web.config में निम्न पंक्ति जोड़ें:
<system.webServer> 
    <handlers> 

     <!-- add the following line --> 
     <add name="SitemapXml" path="sitemap.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/> 

    </handlers> 
</system.webServer> 
  1. प्लेस अपने MVC आवेदन पत्र में एक मार्ग है कि एक ActionResult को यह अनुरोध (इससे पहले कि आप का ध्यान रखें मेल खाता है आपके डिफ़ॉल्ट मार्ग):
routes.MapRoute(
    name: "Sitemap", 
    url: "sitemap.xml", 
    defaults: new { controller = "YourControllerName", action = "YourActionName" } 
); 
संबंधित मुद्दे