2013-02-02 14 views
27

मैं निम्नलिखित (और इसी तरह) यूआरएल मेरी ASP.net MVC4/WebAPI परियोजना में काम करने के लिए प्राप्त करने के लिए कोशिश कर रहा हूँ:फ़ाइल-नाम के साथ ASP.net MVC4 WebAPI मार्ग में यह

http://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll 

मार्ग जिम्मेदार इस यूआरएल के लिए इस तरह दिखता है:

 config.Routes.MapHttpRoute(
      name: "Nav", 
      routeTemplate: "api/nav/{project}/{assembly}/{namespace}/{type}/{member}", 
      defaults: new { controller = "Nav", assembly = RouteParameter.Optional, @namespace = RouteParameter.Optional, type = RouteParameter.Optional, member = RouteParameter.Optional } 
     ); 

अगर मैं इसे हटा देता हूं तो यह ठीक काम करता है। फ़ाइल नाम में, या यदि मैं यूआरएल के पीछे एक स्लैश जोड़ता हूं, लेकिन इसका मतलब यह भी है कि मैं Url.Route -methods आदि का उपयोग नहीं कर सकता हूं। मुझे जो त्रुटि मिलती है वह एक सामान्य 404-त्रुटि (नीचे छवि) है।

enter image description here

मैं अपने web.config को <httpRuntime targetFramework="4.5" relaxedUrlToFileSystemMapping="true" /> जोड़ने की कोशिश की है, और मैं भी

<compilation debug="true" targetFramework="4.5"> 
    <buildProviders> 
    <remove extension=".dll"/> 
    <remove extension=".exe"/> 
    </buildProviders> 
</compilation> 

जोड़ने की कोशिश की है और यह से कोई भी काम करने लगता है। तो मेरा सवाल मूल रूप से है, मैं इस यूआरएल को काम करने के लिए कैसे प्राप्त कर सकता हूं, और सही तरीके से मानचित्र कर सकता हूं?

+0

केवल मार्ग का अंतिम भाग वैकल्पिक हो सकता है। उदाहरण में आपने दिखाया है कि आपने परियोजना वैकल्पिक को छोड़कर सभी मार्ग पैरामीटर बनाए हैं जो स्पष्ट रूप से संभव नहीं है। यूआरएल में आपने दिखाया है कि आप यूआरएल के 'नेमस्पेस' और 'टाइप' भाग' खो रहे हैं। केवल 'सदस्य' भाग वैकल्पिक हो सकता है क्योंकि यह मार्ग के अंत में परिभाषित किया गया है। –

+0

यह सच नहीं है, और यह बिना किसी समस्या के काम करने के लिए साबित हुआ है। आप जितना चाहें उतने हिस्सों को वैकल्पिक बना सकते हैं। उदाहरण के लिए, मेरे उत्तर में किए गए परिवर्तन से पहले, यूआरएल '/ एपीआई/एनवी/स्पोटीफायर' ने एक आकर्षण के रूप में काम किया था। – Alxandr

उत्तर

42

आप अपने <system.webServer> की <handlers> अनुभाग के लिए निम्न हैंडलर जोड़ सकते हैं:

<add 
    name="ManagedDllExtension" 
    path="api/nav/*/*.dll" 
    verb="GET" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" 
/> 

इससे प्रबंधित पाइपलाइन के माध्यम से .dll युक्त सभी अनुरोध किए जाएंगे। यह भी ध्यान दें कि प्रदर्शन प्रदर्शन को सीमित करने के लिए मैंने उन्हें केवल जीईटी क्रिया तक कैसे सीमित कर दिया है।

+0

शानदार, विचार यह नहीं होना चाहिए < 'पहले से कवर है? मुझे यकीन नहीं है कि" *। " – Alxandr

+2

नहीं, यह इसे कवर नहीं कर रहा है। आपको एक्सटेंशन निर्दिष्ट करने की आवश्यकता है। अगर यूआरएल में कोई एक्सटेंशन है, तो आईआईएस सोच लेगा यह एक स्थिर फ़ाइल है। –

+1

+1 ऐसा करने का सही तरीका दिखाने के लिए +1। –

10

इसे मिला। क्या इसकी आवश्यकता हो इस (और शायद चीजें मैं मूल पोस्ट में ऊपर में जोड़ी गई कुछ):

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

मैं आपको यह जोड़ने की अनुशंसा नहीं करता क्योंकि इसका खराब दुष्प्रभाव होगा => सभी अनुरोध अब प्रबंधित पाइपलाइन से गुज़रेंगे जो आपके आवेदन के प्रदर्शन पर नकारात्मक प्रभाव डालेगा। –

+0

सच है, मुझे समय में एक बेहतर समाधान मिल सकता है, हालांकि, 90% से अधिक अनुरोध पहले से ही प्रबंधित अनुरोध हैं, इसलिए मुझे नहीं लगता कि प्रदर्शन-हिट बहुत बड़ी होगी ... केवल एक चीज जो ' प्रबंधित पाइपलाइन के माध्यम से लोड छवियां हैं, और मेरे पास उनके पूरे पृष्ठ पर लगभग 2 हैं ... – Alxandr

+1

'runAllManagedModulesForAllRequests = "true" सक्रिय किए बिना इसे बनाने के सही तरीके के लिए मेरा उत्तर चेकआउट करें। –

0

मेरा व्यापार बंद मार्ग के अंत में /end जोड़ना था। . को अंतिम / से पहले अनदेखा कर दिया गया है।

बराबर यूआरएल होगा http://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll/end

लाभ यह है कि आपको अपनी संपत्ति पर प्रदर्शन नहीं मिलता है।

+0

कोई नकारात्मक कारण नहीं होने पर आपको नकारात्मक वोट मिलता है। – kim3er

+0

यह मेरे लिए काम करता था और सबसे सरल समाधान था हालांकि, मैंने अभी अंत में एक '/' जोड़ा है। –

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