2012-12-16 18 views
11

मैं समझने की कोशिश कर रहा हूं कि रूटएक्सस्टिंगफाइल कैसे काम करता है। इसलिए मैंने एक नया एमवीसी 3 इंटरनेट प्रोजेक्ट बनाया है (एमवीसी 4 वही तरीके से व्यवहार करता है) और एक HTMLPage.html फ़ाइल को मेरे प्रोजेक्ट के सामग्री फ़ोल्डर में डाल दिया है। अब मैं Global.asax फ़ाइल के पास गया और RegisterRoutes समारोह संपादित तो यह इस तरह दिखता है:एएसपी.नेट एमवीसी 3: रूटएक्सस्टिंगफाइल = सच का कोई प्रभाव नहीं पड़ता

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.RouteExistingFiles = true; //Look for routes before looking if a static file exists 

    routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new {controller = "Home", action = "Index", id = UrlParameter.Optional} // Parameter defaults 
      ); 
    } 

अब यह मुझे जब मैं एक स्थानीय होस्ट का अनुरोध कर रहा हूँ एक त्रुटि देना चाहिए: XXXX/सामग्री/HTMLPage.html चूंकि कोई "सामग्री" नियंत्रक नहीं है और अनुरोध निश्चित रूप से डिफ़ॉल्ट पैटर्न को हिट करता है। लेकिन इसके बजाय मैं अपना एचटीएमएल पेज देख रहा हूं। मैं यहाँ क्या गलत कर रहा हूँ?

अद्यतन: मुझे लगता है कि मुझे छोड़ना होगा। यहां तक ​​कि अगर मैं इस तरह का मार्ग जोड़ रहा:

routes.MapRoute("", "Content/{*anything}", new {controller = "Home", action = "Index"}); 

यह अभी भी मुझे HTMLPage की सामग्री दिखाता है। जब मैं ~/content/HTMLPage जैसे यूआरएल का अनुरोध करता हूं तो मुझे इंडेक्स पेज अपेक्षित के रूप में मिल रहा है, लेकिन जब मैं .html या .txt जैसी फ़ाइल एक्स्टेंस्टियन जोड़ता हूं तो सामग्री दिखायी जाती है (या 404 त्रुटि अगर फ़ाइल मौजूद नहीं है)। यदि कोई इसे वीएस2012 में देख सकता है तो कृपया मुझे बताएं कि आपको क्या परिणाम मिल रहा है। धन्यवाद।

उत्तर

5

RouteExistingFiles फ़ाइलों को देखने के लिए नहीं रखा जाता है यदि उनके लिए कोई रास्ता नहीं है, तो यह जांचने से पहले कि यह फ़ाइल मौजूद है या नहीं, यह सिर्फ रूट्स की जांच करता है। यदि कोई मिलान करने वाला मार्ग नहीं है, तो यह जांचना जारी रखेगा कि कोई मिलान फ़ाइल है या नहीं।

+0

"{नियंत्रक}/{action}/{id}" पैटर्न के साथ डिफ़ॉल्ट मार्ग ~/Content/HTMLPage.html अनुरोध के लिए एक अच्छा उम्मीदवार जैसा दिखता है। तो एक मिलान मार्ग है। –

+0

@ ऑलेक्ज़ेंडर कैप्लुन: यह केवल तभी मेल खाता है जब आपके पास वास्तव में "सामग्री" नामक नियंत्रक होता है और "HTMLPage.html" नामक उस नियंत्रक में एक क्रिया विधि होती है। – Guffa

+0

यह समझदार लगता है, लेकिन अभी भी काम नहीं करता है। यहां मैंने अपने रजिस्टर रूट्स फ़ंक्शन के शीर्ष पर जो जोड़ा है, वह है: 'routes.MapRoute ( " ExactMatch ", " सामग्री/HTMLPage.html ", नया {नियंत्रक =" होम ", क्रिया =" इसके बारे में "}); '। अभी भी मुझे एचटीएमएल पेज की सामग्री दिखाता है। अनुलेख मैं समझता हूं कि इसे इस तरह काम करना चाहिए (मैनुअल कहता है कि इसे चाहिए) लेकिन ऐसा नहीं है कि मैं अनुमान लगा रहा हूं कि मैंने कुछ गलत किया है। मैं स्थानीय रूप से वीएस2012 और विंडोज 7 पर परीक्षण कर रहा हूं। –

5

विजुअल स्टूडियो 2012 आईआईएस एक्सप्रेस का उपयोग करता है। आपको आईआईएस को एमवीसी रूटिंग सिस्टम में पारित होने से पहले डिस्क फ़ाइलों के अनुरोधों को अवरुद्ध न करने की आवश्यकता है।

<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" 
    preCondition="" /> 

Win7/8 में आप इस पथ पर कॉन्फ़िग फ़ाइल पा सकते हैं:: %userprofile%\Documents\IISExpress\config\applicationhost.config

+0

यह मेरे लिए काम करता है, धन्यवाद, लेकिन मुझे लगता है कि इसे प्रति समाधान कॉन्फ़िगर नहीं किया जा सकता है? – Savage

+0

आप इस मॉड्यूल को जोड़ने से पहले जोड़कर जोड़ सकते हैं। Https://svenaelterman.wordpress.com/2011/01/31/using-asp-net-4-0-extension-less-routing-on-iis-7-5/ देखें – XPD

16

स्टैटिक फ़ाइलें आप निम्न चरणों का पालन करना होगा के लिए मार्ग को सक्षम करने के लिए आप सेट preCondition कॉन्फ़िग फ़ाइल में रिक्त स्ट्रिंग पर विशेषता की जरूरत है।

RouteConfig.cs में मौजूदा फ़ाइलों

routes.RouteExistingFiles = true; 

के लिए मार्ग, अपने पथ के लिए एक मार्ग जोड़ें (सुनिश्चित करें कि विशेष पथ सामान्यीकृत रास्तों से ऊपर हैं)

routes.MapRoute(
      name: "staticFileRoute", 
      url: "Public/{file}/", 
      defaults: new { controller = "Home", action = "SomeAction" } 
     ); 

इसके बाद आपके अनुप्रयोग को कॉन्फ़िगर सक्षम ताकि स्थैतिक फ़ाइलों के लिए अनुरोध "TransferRequestHandler" द्वारा नियंत्रित किया जाता है। Webconfig system.web सर्वर के अंतर्गत> हैंडलर निम्नलिखित प्रविष्टि जोड़ते हैं।

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

'पथ' का मूल्य आपकी आवश्यकता के आधार पर अधिक सामान्य या विशिष्ट हो सकता है। लेकिन मैं इसे किसी की ज़रूरत के अनुसार हमेशा विशिष्ट मानना ​​पसंद करता हूं। इसे बहुत सामान्य रखने से अन्य साइट विशिष्ट संसाधनों जैसे कि .js या css फ़ाइलों की सेवा करना बंद हो जाएगा। उदाहरण के लिए यदि उपरोक्त पथ = "*" के रूप में सेट किया गया है, तो सीएसएस (सामग्री फ़ोल्डर के अंदर) के लिए भी अनुरोध करें जो कि आपका पृष्ठ कैसा दिखता है इसके लिए ज़िम्मेदार है, यह भी आपके नियंत्रक की कार्रवाई में समाप्त होगा। कुछ जो आपको पसंद नहीं होगा।

संबंधित मुद्दे