2012-06-29 22 views
17

मैं googling किया गया है और कुछ घंटों के लिए संवारता है और वास्तव में, बहुत प्रगति की है इसलिए उम्मीद है कि यहाँ कोई मदद कर सकता है के लिए बाईपास staticfile हैंडलर।ASP.NET MVC रूट: पथ

मैं एक निश्चित पथ के लिए सभी अनुरोधों को प्राप्त करने के लिए कोशिश कर रहा हूँ एक 3 पार्टी घटक द्वारा नियंत्रित किया जा करने के लिए।

EDIT और मुझे सामान्य रूप से व्यवहार करने के लिए अन्य सभी पथों के सभी अनुरोधों की आवश्यकता है। आगे

routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler())); 

सभी परंपरागत मार्गों को सही ढंग से हैंडलर, जो 3 पार्टी घटक के लिए अच्छी तरह से करने के लिए अग्रेषित करता है:

मैं इस तरह एक वाइल्डकार्ड मानचित्रण के साथ एक मार्ग हैंडलर उपयोग कर रहा हूँ। जब मैं स्थैतिक फाइलों (.html, .txt, आदि) को दबाता हूं, तो वे मेरे हैंडलर की बजाय स्टेटिकफाइल हैंडलर द्वारा उठाए जाते हैं, इसलिए मैं स्टेटिकफाइल हैंडलर को इस तरह से (सरलीकृत) बंद करने का प्रयास कर रहा हूं:

<system.webServer> 
    <handlers> 
    <remove name="StaticFile"/> 
    </handlers> 
</system.webServer> 

यह स्टेटिकफ़ाइल हैंडलर बंद कर देता है, लेकिन एमवीसी अभी भी मार्ग नहीं उठाता है।

मैं के बाद से ऐसा लगता है वहाँ यह करने के लिए एक MVC-खुश तरीका होना चाहिए मेरे अपने हैंडलर बनाने और एएसपी अनुरोध स्टैक में इंजेक्शन लगाने पर वापस आने का नहीं करना चाहेंगे।

किसी भी विचार? और धन्यवाद।

उत्तर

14

यहां कुछ विकल्प हैं।

http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

तुम सच में asp.net पाइप के माध्यम से चल रहा है सभी अनुरोधों को चाहते हैं तो आपको जरूरत है।

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 

अद्यतन

एक अन्य विकल्प है, खासकर अगर स्थिर हैंडलर बायपास करने के लिए अपनी जरूरत के आपकी साइट के एक सबसेट तक सीमित है, निम्न

<add name="ApiURIs-ISAPI-Integrated-4.0" 
    path="/subdirectory/*" 
    verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 

को ध्यान में रखते कैसे पर उपयोग करने के लिए है एमवीसी साइट्स, सबसे स्थिर फाइलों को कुछ अच्छी तरह से ज्ञात निर्देशिकाओं से संभाला जाता है, यह एक बेहतर विकल्प है।

+0

धन्यवाद। यह निश्चित रूप से मैंने कोशिश की है, लेकिन मैं चाहता हूं कि अन्य सभी पथ सामान्य रूप से संभाले जाएं। यह वास्तव में ऐसा प्रतीत होता है कि ऐसा करने के लिए कोई एमवीसी तरीका नहीं है, और मुझे बस ब्रेक करना चाहिए और एमवीसी से पहले हैंडलर जोड़ना चाहिए। – jmoss

+0

ठीक वही चीज़ों के बारे में निश्चित नहीं है जो आप चाहते हैं और संभाल नहीं करना चाहते हैं, लेकिन हाँ, एमवीसी में चीजों को संभालने के लिए एएसपीनेट पाइप को सभी उचित अनुरोध प्राप्त करने की आवश्यकता है। –

+0

महत्वपूर्ण नोट: '' केवल एक एकीकृत मोड पाइपलाइन चलाने वाले अनुप्रयोग पूल के लिए लागू होता है। यह क्लासिक मोड के तहत चल रहे ऐप पूल के लिए काम नहीं करेगा। – BenSwayne

2

इस लिए सबसे अच्छा समाधान शायद एक MVC अनुकूल विकल्प के लिए मूल URL से अनुरोध प्रॉक्सी के लिए एक URL Rewriter उपयोग करने के लिए है।

उदाहरण के लिए, आप स्वचालित रूप से एक डेटाबेस से सेवा की सामग्री में सापेक्ष URL लोड करने में सक्षम होने की जरूरत है कहते हैं।

routes.MapRoute(
    "Load Item", 
    "load/{itemId}", 
    new { controller = "Load", action = "Index" } 
    ); 

routes.MapRoute(
    "Load Relative Item", 
    "load/{itemId}/rel", //?path= 
    new { controller = "Load", action = "Relative" } 
    ); 

और फिर अपनी कार्रवाई तरीकों स्पष्ट हैं::

public ActionResult Index(int itemId) { ... } 

public FileStreamResult Relative(int itemId, string path) { ... } 

पहले पुनर्लेखन नियम वहाँ युक्त रास्तों को रोकने के लिए है

RewriteRule ^/load/(\d+)/rel(\?.*)? - [L] 
RewriteRule ^/load/(\d+)/(.*)$ /load/$1/rel?path=$2 [P,QSA,L,NC] 

उन नियमों आप दो MVC मार्गों सेट करने देते हैं/पुनः लिखने से दूर; वे पहले से ही अपने अंतिम रूप में हैं। दूसरा पुन: लिखने के नियम प्रॉक्सी (पुनर्निर्देशन के बजाय) अनुरोध।

उदा।

/load/1234/file.xml 

/load/1234/rel?path=file.xml 

हो जाता अनुरोध प्रॉक्सी के बजाय एक ग्राहक रीडायरेक्ट नेस्टेड संबंधित पथ के रूप में अच्छी तरह से काम करने के लिए सक्षम बनाता है कर (और अंत उपयोगकर्ता से गुप्त सॉस छुपाता है।)