2013-11-01 6 views
6

मैं एक मार्ग टेम्पलेट की स्थापना की है:वाइल्डकार्ड मार्ग टेम्पलेट

config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{id}/{*wildcard}", 
     defaults: new { id = RouteParameter.Optional } 
     ); 

नियंत्रक की कार्रवाई हस्ताक्षर:

public IEnumerable<object> Get(Int64 id,string abc) 

मैं यूआरएल http://mymachine.com/api/Individuals/1?abc=4 के साथ मिलाने का प्रयास किया है, लेकिन यह मेरे लिए एक अपवाद देता

{"$ id": "1", "संदेश": "त्रुटि में हुआ।", "अपवाद संदेश": "ऑब्जेक्ट संदर्भ नहीं है एक वस्तु का एक उदाहरण को एट "," ExceptionType। ":" System.NullReferenceException "," StackTrace ":" System.Web.Http.ValueProviders.Providers.RouteDataValueProvider.d__4.MoveNext() पर \ r \ एन

आश्चर्यजनक रूप से, http://mymachine.com/api/Individuals?id=1&abc=4 नियंत्रक, क्रिया और पैरामीटर के साथ मेल खाता है।

मैंने सोचा था कि "{आईडी}" के "एपीआई/{नियंत्रक}/{आईडी}/{* वाइल्डकार्ड}" काम करेंगे।

क्यों?

+0

आप गौर कर सकते हैं वैकल्पिक पैरामीटर नहीं हो सकता है तो एक गैर वैकल्पिक एक! अगर आप क्वेरी स्ट्रिंग के रूप में एबीसी पास कर रहे हैं तो आपको इसे रूट में रखने की आवश्यकता नहीं है! अगर मैं आपकी जगह पर था तो मैं अपना मार्ग दोबारा कर दूंगा ... इसे एक विचार दें –

उत्तर

7

वाइल्डकार्ड रूटिंग पैरामीटर के लिए शेष यूआरआई से मिलान करने के लिए रूटिंग इंजन को बताएगा (उदाहरण के लिए, "प्रकाशन तिथि द्वारा पुस्तकें प्राप्त करें" अनुभाग in this article देखें)।

इसका मतलब यह नहीं है कि किसी भी पैरामीटर के लिए किसी भी मनमानी नामित चर से मिलान करें - यह कुछ वेबएपी डिफ़ॉल्ट रूप से आपके रूट कॉन्फ़िगरेशन के बावजूद क्वेरीस्ट्रिंग पर आइटम्स के साथ करता है (इसलिए आप दूसरी यूआरआई क्यों काम करते थे - यह किसी भी मार्ग से मेल नहीं खाता था) ।

यह आपके मार्ग में {id} से मेल नहीं खाता क्योंकि यह {wildcard} नामक पैरामीटर की अपेक्षा कर रहा था जिसे वैकल्पिक के रूप में चिह्नित नहीं किया गया था।

समझाने के लिए, अगर आप बस 'एबीसी' को 'वाइल्ड कार्ड' बदल दिया है:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}/{*abc}", 
    defaults: new {id = RouteParameter.Optional}); 

तो यह सफलतापूर्वक से मेल खाएंगे निम्नलिखित यूआरआई:

http://mymachine.com/api/Individual/1/a/b/c

मूल्यों के साथ id=1, abc=a/b/c

ठीक करने के लिए, बस अपने मार्ग से वाइल्डकार्ड को हटा दें, ताकि ऐसा लगता है:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new {id = RouteParameter.Optional}); 
4

गोइड से उत्तर सही है। मैं सिर्फ प्रश्न के दूसरे भाग का जवाब देना चाहता हूं:

आश्चर्यजनक रूप से, http://mymachine.com/api/Individuals?id=1&abc=4 नियंत्रक, क्रिया और पैरामीटर के साथ मेल खाता है।

जब से तुम आईडी = RouteParameter.Optional, अगर मार्ग आईडी प्रदान नहीं करता है, यह अभी भी मैचों मार्ग टेम्पलेट है। प्लेसहोल्डर {* वाइल्डकार्ड} शेष मार्ग की तलाश करता है और इसे "वाइल्डकार्ड" कुंजी के नीचे रूट शब्दकोश में डाल देता है। इस मामले में, यह खाली स्ट्रिंग (या शून्य) है।

याद रखें कि क्वेरी पैरामीटर भी रूट शब्दकोश में जाते हैं। इसलिए, अपने मार्ग शब्दकोश होगा: { "id": "1", "abc": "4", "वाइल्डकार्ड": ""}

अधिक जानकारी के लिए, आप http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

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