ASP.NET में JSON वापस करने के लिए WebAPI या MVC का उपयोग करना


138

मैं एक ASP.NET MVC एप्लिकेशन का निर्माण कर रहा हूं जो क्लाइंट-स्क्रिप्ट भारी है, यह DOM को मैनिपुलेट करने के लिए JSON और jQuery का उपयोग करेगा।

मेरी समझ वेब API नियंत्रक और MVC नियंत्रक दोनों JSON को वापस कर सकती है।

मेरे परिदृश्य को देखते हुए, मुझे एक वेब एपीआई नियंत्रक या एक एमवीसी नियंत्रक का उपयोग करना चाहिए ?



1
ध्यान रखना महत्वपूर्ण है कि यह प्रश्न एक निश्चित संदर्भ के लिए विशिष्ट है: लेखक यह जानना चाहता है कि यदि केवल जॅन्सन वापस किया जाना चाहिए तो कौन से नियंत्रक का उपयोग करना चाहिए। REST API विभिन्न मीडिया फ़ॉर्मेटिंग को सामग्री बातचीत (जैसे: xml स्वीकार करें, स्वीकार करें) पर निर्भर करता है। इस मामले में WebAPI नियंत्रक आपका सबसे अच्छा विकल्प है
प्रहरी

जवाबों:


156

वेब एपीआई नियंत्रकों को किसी भी ASP.NET अनुप्रयोग में बनाया और होस्ट किया जा सकता है, न कि केवल MVC अनुप्रयोगों के लिए। इस प्रकार, एक वेब एपीआई बनाने का एक स्पष्ट कारण यह है कि यदि आपके पास MVC फ्रंट-एंड नहीं है (उदाहरण के लिए, आपकी कंपनी / संगठन द्वारा होस्ट की गई क्लासिक, Restful वेब-सेवाएँ।)

एमवीसी कंट्रोलर आमतौर पर एमवीसी फ्रेमवर्क पर निर्भर करते हैं, यदि आप डिफ़ॉल्ट टेम्प्लेट देखते हैं और समुदाय और आपके साथियों द्वारा किए गए अधिकांश काम आप देखेंगे कि लगभग सभी एमवीसी कंट्रोलर को व्यू को ध्यान में रखते हुए लागू किया जाता है।

निजी तौर पर, जब मैं किसी दृश्य () के साथ प्रतिक्रिया देने का इरादा रखता हूं, तो मैं एमवीसी कंट्रोलरों का उपयोग करता हूं, और मैं किसी ऐसी चीज के लिए वेब एपीआई का उपयोग करूंगा जो किसी विशेष दृश्य पर निर्भर नहीं है।

निश्चित रूप से कैवेट हैं, लेकिन आम तौर पर बोलना यदि आपको एमवीसी के मॉडल बाइंडिंग व्यवहार की आवश्यकता नहीं है, तो आपकी सेवा डेटा-केंद्रित है, और संचालन डेटा-केंद्रित (जैसे सीआरयूडी संचालन) हैं, तो आप संभवतः 'वेब एपीआई नियंत्रक' चाहते हैं। 'के बजाय' मॉडल-व्यू कंट्रोलर '। इसके विपरीत, यदि आपके ऑपरेशन दृश्य-केंद्रित हैं (जैसे उपयोगकर्ता को उपयोगकर्ता व्यवस्थापक पृष्ठ वितरित करना), या आपको 'ajax partials' (बहुत संभावना नहीं) उत्पन्न करने के लिए MVC के मॉडल बाइंडिंग की आवश्यकता है, तो आप इसके बजाय MVC नियंत्रक चाहते हैं।

व्यक्तिगत रूप से, मैं JSON- आधारित रेस्टफुल क्लाइंट को चलाने के लिए वेब एपीआई नियंत्रकों का उपयोग करता हूं, मैं मूल ब्राउज़र रूटिंग और एसपीए की डिलीवरी के लिए एमवीसी नियंत्रकों का उपयोग करता हूं।


32

WebAPI एक एपीआई बनाने के लिए है। यदि आप चाहते हैं कि कोई व्यक्ति XML, JSON, आदि में आपके API का उपभोग करने में सक्षम हो, तो आप एक वेब एप बना सकते हैं।

आपके मामले में आपको केवल JSON में क्लाइंट से बात करने की आवश्यकता है।

हालांकि आपकी वेबसाइट ज्यादातर क्लाइंट स्क्रिप्ट द्वारा संचालित है, फिर भी आप ASP.NET MVC कंट्रोलर का सही उपयोग करेंगे? और जब से आप पहले से ही संस्थाओं के आधार पर अपने नियंत्रकों को तार्किक रूप से विभाजित कर सकते हैं, तो यह उन जोंस सेवारत तरीकों को जोड़ने के लिए समझ में आता है, जो विशेष रूप से वेब एपीआई के लिए एक और वर्ग बनाने के विरोध में हैं।

तो आपकी विशेष स्थिति के लिए (अगर मैं सही तरीके से समझूं), मैं कंट्रोलर्स के साथ रहना चाहूंगा।


धन्यवाद, क्या वेबपीआई बनाम नियंत्रक बनाने के तरीके में अंतर है?
नील पुं

1
@flybyte हाँ आपको ApiController से प्राप्त करने की आवश्यकता है, asp.net/web-api/overview/getting-started-with-aspnet-web-api/…
मुहम्मद हसन खान

4
वेब एप JSON कर सकता है, साथ ही आपके द्वारा सूचीबद्ध अन्य विधियां भी। कंट्रोलर कैंट (बड़े करीने से) को एपीआई में बदल दिया जाता है, इसलिए उपयोगकर्ता को यह पूछने के लिए दूरदर्शिता होती है - मैं अधिक स्केलेबल / लचीले समाधान का उपयोग करने का सुझाव दूंगा। ऐसा नहीं है जैसे कि अपने पुराने स्कूल WCF सेवाओं की तरह, वेब एपीआई आमतौर पर शक्तिशाली और लचीला दोनों है। इसलिए जब आपको केवल सरल परिदृश्यों की आवश्यकता होती है तो यह आपके रास्ते से बाहर रहता है। लेकिन आप बिजली मिल गया आपको इसकी आवश्यकता चाहिए है
स्टीव

8

उत्तर चिंताओं के पृथक्करण के लिए उबलता है, सेवाओं के निर्माण को तेज करता है और कॉन्फ़िगरेशन के बजाय सम्मेलन पर भरोसा करता है।

नियंत्रकों की मुख्य जिम्मेदारी दृश्य और आपके मॉडल के बीच समन्वयक के रूप में काम करना है, लेकिन जहां एपीआई की मुख्य जिम्मेदारी डेटा पर काम करना है। एपीआई के सम्मेलनों के मामले में सीआरयूडी संचालन करना वास्तव में आसान है। नीचे CRUD ऑपरेशन और HTTP क्रियाओं के बीच मैपिंग है

  • पढ़ो इसे
  • पोस्ट: बनाएँ
  • PUT: अपडेट करें
  • DELETE: हटाएं

इसलिए एपीआई के साथ आपको अलग-अलग कार्रवाई करने और HTTP क्रियाओं के साथ विशेषता बनाने की आवश्यकता नहीं है।


0

ApiController के साथ मेरी एकमात्र चिंता यह है कि यह साइट-आधारित है न कि क्षेत्र-आधारित। एक साइट में आपके नियंत्रक विधियों के नाम के लिए केवल एक एपिक कंट्रोलर सबफ़ोल्डर हो सकता है। ऐसी परिस्थितियाँ हैं जिन्हें आप विभिन्न क्षेत्रों में नियंत्रक नाम की नकल करना चाहते हैं:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

मुझे याद है कि ऐसा करने में सक्षम होने के लिए कुछ कस्टम कोड सेटिंग्स हैं लेकिन यह डिफ़ॉल्ट रूप से काम नहीं करता है।


यह एक टिप्पणी की तरह लगता है, उत्तर नहीं।
डायलन हेस

वास्तव में आप क्या कह रहे हैं मत करो। यदि आप एक कंट्रोलर एरिया 1 एक्स कॉन्ट्रोलर का नाम देते हैं तो आप ऐसा कर सकते हैं: domain.com/Area1X/1, एक कंट्रोलर बनाएँ: Area2XController और फिर इसे एक्सेस करें: domain.com/Area2X/1। बड़ा सवाल यह है कि आप ऐसा क्यों करना चाहते हैं। क्षेत्र का नाम सार है यह एक उपयोगकर्ता के लिए कुछ भी नहीं कहता है। यदि आपके पास 4 क्षेत्र हैं, तो इसके लिए कार्यात्मक उद्देश्य नाम का उपयोग करना बेहतर है।
हरमन वान डेर ब्लूम

0

मैं शॉन विल्सन के (शीर्ष उत्तर) उत्तर से सहमत हूं, लेकिन यह निश्चित नहीं है कि जैसा कि मैं अभी थोड़ा भ्रमित हूं और फिर भी निम्नलिखित (शायद गलत) पूर्वधारणा के साथ समझने की कोशिश कर रहा हूं -

  • ग्राहक को JSON डेटा देने के लिए WebAPI नियंत्रक का उपयोग करें ताकि क्लाइंट दृश्य हेरफेर को संभाल सके। इस प्रक्रिया को देखने की आवश्यकता नहीं है, बल्कि जो भी विधि कहा जाता है (यानी एक जावास्क्रिप्ट अनुरोध) के लिए केवल एक प्रतिक्रिया वापस चाहिए ताकि ग्राहक किसी भी क्लाइंट-साइड हेरफेर को संभाल सके।
  • MVC कंट्रोलर का उपयोग करें जब आपको पृष्ठ_ लोड (यानी एसपीए एप्लिकेशन के लिए नहीं) के बाद या ठीक बाद किसी दृश्य में हेरफेर करने के लिए डेटा का उपयोग करने की आवश्यकता होती है।

आप देखते हैं, मुझे नहीं पता कि मैं यहां कैसे गलत हूं और उलझन में हूं क्योंकि शॉन के उत्तर की अंतिम पंक्ति "मैं मूल ब्राउज़र रूटिंग और एसपीए की डिलीवरी के लिए एमवीसी नियंत्रकों का उपयोग करता हूं।" - शायद मुझे पूरी तरह से पता नहीं है कि एक बेचैन ग्राहक क्या होता है जब मैंने यह मान लिया कि यह जावास्क्रिप्ट विधि हो सकती है जो कि JSON फॉर्म में प्रतिक्रिया प्राप्त करती है। यह Stackoverflow में निकटतम पोस्ट है जो मेरे प्रश्न के उत्तर के रूप में दूरस्थ रूप से संबंधित थी इसलिए मैं संभवतः संभवतः दोहराए जाने वाले प्रश्नों के बजाय इस पोस्ट का उत्तर दे रहा हूं।


" व्यू को डिलीवर करने के लिए एमवीसी कंट्रोलर का उपयोग करें " आप व्यू में कम्पोजिशन के लिए एमवीसी पार्टिकल्स में एसपीए को लपेट सकते हैं। ASP.NET MVC देवों को इस अवधारणा को समझना चाहिए। आप क्लाइंट को HTML + JS रेंडर करने के लिए व्यू जनरेशन (जैसे सर्वर-साइड प्रोसेसिंग) के दौरान नियमित रेजर + ASP.NET सुविधाओं का उपयोग कर सकते हैं। समस्या यह है कि कई देवता यहां अनुभव करेंगे कि यह विचार है कि स्थैतिक HTML + JS फाइलें एसपीए एक एसपीए नहीं हैं। कभी-कभी सामग्री को उपयोगकर्ता के लिए गतिशील और विशिष्ट होने की आवश्यकता होती है , लेकिन सभी ढांचे इस तथ्य से अलग होते हैं। "एसपीए" और "एमवीसी" परस्पर अनन्य नहीं हैं।
शॉन विल्सन

0

इस परिदृश्य में, मैं WebApi की सिफारिश करूंगा क्योंकि यह जावास्क्रिप्ट अनुरोधों के आधार पर डेटा स्थानांतरित करने के लिए एकदम सही है। मैं आमतौर पर अपने WebApi नियंत्रकों को विकसित करूंगा ताकि वे एक JSON फ्रेंडली ऑब्जेक्ट लौटाएं जो तब मेरे जावास्क्रिप्ट द्वारा आसानी से पार्स किया जा सकता है।

केवल वास्तविक समय जहां आप इस प्रकार की चीज़ के लिए एमवीसी नियंत्रक पर एक क्रिया का उपयोग करना चाहते हैं यदि आप कुछ HTML उत्पन्न करना चाहते हैं और अपने पृष्ठ के खंडों को जावास्क्रिप्ट कॉल से बदलना चाहते हैं।

उदाहरण के लिए:

आपके पास एक JQuery UI Datepicker है जो चयन करने पर रेडियो बटन की एक सूची बनाता है जो चुने हुए दिन की घटनाओं का प्रतिनिधित्व करता है।

इस परिदृश्य में, आप कुछ JSON को वापस करने के लिए WebApi का उपयोग कर सकते हैं और फिर जावास्क्रिप्ट का उपयोग करके आवश्यक HTML उत्पन्न कर सकते हैं लेकिन आम तौर पर जावास्क्रिप्ट का उपयोग करके बहुत सारे HTML बनाने के लिए यह बुरा अभ्यास है। यह बेहतर होगा कि HTML का निर्माण C # करें और फिर इसे आंशिक दृश्य के माध्यम से लौटाएं क्योंकि इस तरह आप जावास्क्रिप्ट पार्सिंग के साथ त्रुटियों का सामना करने की संभावना कम है। इसका उल्लेख नहीं करना HTML को लिखने में बहुत आसान बनाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.