2011-01-13 8 views
9

तो मैं आईआईएस 7 के तहत चल मेरी MVC 3 आवेदन में इस तरह एक मार्ग है:MVC रूटिंग जब एक फ़ाइल वास्तव में निर्दिष्ट स्थान पर मौजूद

routes.MapRoute(
       "VirtualTourConfig", 
       "virtualtour/config.xml", 
       new { controller = "VirtualTour", action = "Config" } 
       ); 

चाल है कि एक फ़ाइल वास्तव में मौजूद है पर/आभासी/config.xml। ऐसा लगता है कि अनुरोध उस स्थान पर एक्सएमएल फ़ाइल को वापस करने के बजाय रूट पर मारने की बजाए है, जो एक्सएमएल को संसाधित करता है, कुछ बदलाव करता है और एक कस्टम XmlResult देता है।

किसी भी सुझाव के बारे में कोई सुझाव है कि मैं मार्ग पर हिट करने के लिए अपने आवेदन को कैसे बता सकता हूं और फ़ाइल में डिस्क मौजूद होने की स्थिति में वास्तविक फ़ाइल नहीं?

संपादित करें: ऐसा लगता है कि मैं Global.asax की RegisterRoutes विधि में routes.RouteExistingFiles = true; उपयोग कर सकते हैं डिस्क पर फ़ाइलों की अनदेखी करने के आवेदन को बताने के लिए। हालांकि, यह वैश्विक स्तर पर ध्वज सेट करता है और एप्लिकेशन के भीतर कई अन्य अनुरोधों को तोड़ देता है। उदाहरण के लिए, मैं अभी भी प्रत्येक स्थिर संपत्ति के लिए रूट सेट करने के बिना सीएसएस फ़ाइल को वापस करने के लिए /assets/css/site.css पर कॉल करना चाहता हूं। तो अब सवाल बन जाता है, क्या प्रति मार्ग के आधार पर ऐसा करने का कोई तरीका है?

+3

मुझे नहीं लगता कि एक आसान तरीका इस लक्ष्य को हासिल करने के लिए है। आप स्थिर फ़ाइल को '~/App_Data' फ़ोल्डर में क्यों नहीं ले जाते हैं? –

उत्तर

6

अब तक का सबसे अच्छा जवाब यह है कि मुझे वैश्विक स्तर पर routes.RouteExistingFiles=true लागू करना है और फिर उन मार्गों को चुनिंदा रूप से अनदेखा करना है जिन्हें मैं मौजूदा फाइलों जैसे .js, .css, आदि से गुज़रना चाहता हूं। इसलिए मैंने कुछ ऐसा किया यह:

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.IgnoreRoute("*.js|css|swf"); 
      routes.RouteExistingFiles = true; 

      routes.MapRoute(
       "VirtualTourConfig", 
       "virtualtour/config.xml", 
       new { controller = "VirtualTour", action = "Config" } 
       ); 
} 

यदि किसी के पास कोई बेहतर समाधान है, तो मैं इसे देखना चाहूंगा। मैं अलग-अलग मार्गों पर "रूटएक्सस्टिंगफाइल" ध्वज को चुनिंदा रूप से लागू करना पसंद करूंगा लेकिन मुझे नहीं पता कि ऐसा करने का कोई तरीका है या नहीं।

0

कोई समाधान नहीं, बस एक विचार है।

आप अपने VirtualPathProvider पर आधारित समाधान को लागू करने का प्रयास कर सकते हैं जो सिस्टम पथों को फाइल करने के लिए वेब पथों का अपना मानचित्रण प्रदान करेगा और उन सभी पथों के लिए डिफ़ॉल्ट प्रदाता का उपयोग करेगा जिन्हें आप ख्याल रखना नहीं चाहते हैं। routes.IgnoreRoute("templates/*.html");, routes.IgnoreRoute("scripts/*.js"); और routes.IgnoreRoute("styles/*.css");:

0

एक बहुत ही सरल समाधान है, निश्चित रूप से अगर आप स्कॉट के जवाब पर विचार, जैसे होगा।

यह आपको रूट्स कोलेक्शन पर पथ की आपूर्ति करने की सादगी देता है और उदाहरण शुरू करने के काम से बचाता है। वर्चुअलपाथप्रोवाइडर।

0

आप UrlRewiting जैसे की कोशिश कर सकते:

<configuration> 
    <system.webServer> 
    <rewrite> 
     <rules> 
     <rule name="VirtualTourConfig"> 
      <match url="^virtualtour/config.xml" /> 
      <action type="Rewrite" url="virtualtour/config" /> 
     </rule> 
     </rules> 
    </rewrite> 

नायब मैं एक अलग यूज-केस के लिए इस का उपयोग कर रहा (यानी asp.net MVC से एक कोणीय एप्लिकेशन की सेवा) - मैं कि क्या परीक्षण नहीं किया MVC रूटिंग यूआरएल पुनर्लेखन के बाद होता है।

मेरे मामले में मैं एक सामान्य MVC मार्ग (अर्थात /Dashboard/ =>DashboardController.Index()) है, लेकिन Views/Dashboard/Index.cshtml में सभी संबंधित पथ की जरूरत MVC मार्ग अर्थात /Dashboard/app/app.module.js से उलझन में हो रही एक स्थिर फ़ाइल सेवा करनी पड़ेगी बिना स्थिर फ़ाइलों की सेवा के लिए। मैं UrlRewriting का उपयोग इस प्रकार /ng/Dashboard/{R:1} को /Dashboard/(.+) मैप करने के लिए:

<configuration> 
    <system.webServer> 
    <rewrite> 
     <rules> 
     <rule name="Dashboard"> 
      <match url="^dashboard/(.+)" /> 
      <action type="Rewrite" url="ng/dashboard/{R:1}" /> 
     </rule> 
     </rules> 
    </rewrite> 
संबंधित मुद्दे