2012-12-21 13 views
9

में वर्जनिंग वेब एपीआई क्रियाएं मेरे पास एक एएसपी.नेट एमवीसी 4 ऐप है। मैं सीखने के उद्देश्यों के लिए नई वेब एपीआई सुविधा का उपयोग करना चाहता हूं। मैं सीखना चाहता हूं कि एक ही एंडपॉइंट का पर्दाफाश कैसे करें, लेकिन इसके विभिन्न संस्करण प्रदान करें। दूसरे शब्दों में, मैं निम्नलिखित की तरह अंतिम बिंदुओं को बेनकाब करना चाहते हैं:एएसपी.नेट एमवीसी 4

http://mysite/1.0/Products/1 
http://mysite/2.0/Products/1 

यह करने के लिए की कोशिश में, मैं डिफ़ॉल्ट "नियंत्रकों" निर्देशिका के भीतर एक "एपीआई" निर्देशिका गयी। "एपीआई" निर्देशिका में, मेरे पास दो अन्य निर्देशिकाएं हैं: "संस्करण 1-0" और "संस्करण 2-0"। उन निर्देशिकाओं में से प्रत्येक में "ProductController" नामक एपीकंट्रोलर है।

मैं अपने WebApiConfig.cs फ़ाइल में निम्नलिखित मार्ग परिभाषा जोड़कर अंतिम बिंदुओं को बेनकाब करने की कोशिश की:

config.Routes.MapHttpRoute(
    name: "1-0Api", 
    routeTemplate: "api/1.0/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

दुर्भाग्य से, मैं समझ नहीं कैसे यूआरएल मैं उपरोक्त कार्यों के माध्यम से बेनकाब करने के लिए। मैं क्या गलत कर रहा हूं? धन्यवाद!

उत्तर

7

आप शायद मुद्दों में चल रहे हैं क्योंकि नियंत्रकों का एक ही नाम है। नियंत्रक नेमस्पेस या जिस फ़ोल्डर में यह है, वह वेबैपी पर कोई फर्क नहीं पड़ता, केवल नाम ही करता है। सबसे सरल बात मैं के बारे में सोच सकते हैं अपने नियंत्रकों ProductsV1Controller और ProductsV2Controller का नाम बदलें और अपने नियंत्रकों को इंगित करने के दो मार्गों की स्थापना के लिए है:

config.Routes.MapHttpRoute(
    name: "1-0Api", 
    routeTemplate: "api/1.0/Products/{id}", 
    defaults: new { controller = "ProductsV1", id = RouteParameter.Optional } 
); 
config.Routes.MapHttpRoute(
    name: "2-0Api", 
    routeTemplate: "api/2.0/Products/{id}", 
    defaults: new { controller = "ProductsV2", id = RouteParameter.Optional } 
); 
बेशक

, इस गंदा हो जाता है यदि आप एकाधिक नियंत्रकों है आप इस में बेनकाब करना चाहते हैं मार्ग। मुझे देखने दो कि क्या मैं आपके लिए कुछ बेहतर नहीं सोच सकता।

+0

वर्तमान में, मेरे पास केवल 1 नियंत्रक (ProductsV1 नियंत्रक) है, और मैं उस एंडपॉइंट तक नहीं पहुंच सकता। मैं क्या गलत कर रहा हूं? परियोजना में कोई अन्य बदलाव नहीं हुआ है। मैंने सचमुच एक नया एएसपी.नेट एमवीसी 4 प्रोजेक्ट शुरू किया और एक वर्जन नियंत्रक जोड़ना चाहता था। –

+0

कई चीजें गलत हो सकती हैं। आपका नियंत्रक सार्वजनिक वर्ग नहीं हो सकता है, नियंत्रक एपीकंट्रोलर से प्राप्त नहीं हो सकता है, या कुछ और। स्थानीय मशीन पर सर्वर से आपको क्या प्रतिक्रिया मिलती है? –

+0

मेरा नियंत्रक एक सार्वजनिक वर्ग है। नियंत्रक ApiContoller से प्राप्त होता है। मेरी स्थानीय मशीन पर, मुझे 404 मिलते हैं। यह अजीब चीज है। –

1

किसी भी मौके पर आपके पास अभी भी डिफ़ॉल्ट वेब एपीआई रूट परिभाषित है और से पहले आपका कस्टम मार्ग है? इससे आपका परिदृश्य विफल हो जाएगा। निम्नलिखित मार्ग परिभाषाएं (आदेश नोट करें) मेरे लिए काम किया।

public static void Register(HttpConfiguration config) { 
    config.Routes.MapHttpRoute(
     name: "1-0Api", 
     routeTemplate: "api/1.0/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 

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

Sebastiaan DAMMANN गया है, अपने ब्लॉग पर, बताया कि कैसे वह IHttpControllerSelector के अपने ही कार्यान्वयन लेखन और इंटरफेस का समर्थन करके वेब एपीआई संस्करण था।

http://damsteen.nl/blog/implementing-versioning-in-asp.net-web-api

उन्होंने यह भी कोड GitHub

https://github.com/Sebazzz/SDammann.WebApi.Versioning

पर NuGet में हमारे लिए डाल दिया और यह पैक है! :)

https://nuget.org/packages/SDammann.WebApi.Versioning

जबकि लागू करने IHttpControllerSelector निश्चित रूप से (imho) सही वेब एपीआई संस्करण करने के लिए रास्ता है, मुझे लगता है कि यह आदर्श होगा अगर वह HTTP पर आधारित संस्करण करने की क्षमता शामिल Accept हैडर (http://barelyenough.org/blog/2008/05/versioning-rest-web-services/ देखें)।

दुर्भाग्य से मेरा ग्राहक पक्ष Accept शीर्षलेख के साथ काम करने में असमर्थ है, इसलिए उसके RouteVersionedControllerSelector मेरे लिए आदर्श है।

संपादित करें: सुनिश्चित नहीं हैं कि मैं इसे याद किया, लेकिन वहां वास्तव में कोई AcceptHeaderVersionedControllerSelector है कि आदर्श रास्ता वर्ज़निंग करने के लिए इस्तेमाल किया जा सकता।मैं वर्तमान में एक नई परियोजना पर यह उपयोग कर रहा हूँ, लेकिन यह अभी भी some drawbacks

0

का उपयोग कार्यान्वयन हम आपके 1 दृष्टिकोण जा रहे हैं तो यह मार्ग और अनुमति देने के लिए मदद करता है हमें v1, v2 के लिए डेटा प्राप्त करने .... लेकिन अब हम एक नियंत्रक तो रूटिंग कोड के लिए v1 का एक उदाहरण और v2 ले लिया है के रूप में नीचे हो जाएगा:

config.Routes.MapHttpRoute(
    name: "1-0Api", 
    routeTemplate: "tables/v1/Products", 
    defaults: new { controller = "ProductsV1", id = RouteParameter.Optional } 
); 
config.Routes.MapHttpRoute(
    name: "2-0Api", 
    routeTemplate: "tables/v2/Products", 
    defaults: new { controller = "ProductsV2", id = RouteParameter.Optional } 
); 

लेकिन हमारे पास 20 से अधिक नियंत्रक और एकाधिक संस्करण हैं, फिर इसे सामान्य कैसे बनाएं।