ASP.NET MVC में ApiController और नियंत्रक के बीच अंतर


343

मैं ASP.NET MVC 4 बीटा के साथ खेल रहा हूं और मुझे अब दो प्रकार के नियंत्रक मिलते हैं: ApiControllerऔर Controller

मैं इस बात पर थोड़ा भ्रमित हूं कि मैं किन परिस्थितियों में एक विशेष नियंत्रक चुन सकता हूं।

पूर्व के लिए: यदि मैं एक दृश्य वापस करना चाहता हूं तो मुझे उपयोग करना है ApiControllerया सामान्य Controller? मुझे पता है कि WCF वेब एपीआई अब MVC के साथ एकीकृत है।

चूंकि अब हम दोनों नियंत्रकों का उपयोग कर सकते हैं कि कोई व्यक्ति किन परिस्थितियों में इसी नियंत्रक के लिए जा सकता है।


23
महत्वपूर्ण: ASPNET कोर का 'विलय' हो गया है ApiControllerऔर Controllerइसलिए यदि आप नए .NET का उपयोग कर रहे हैं, तो आपको अब ApiController के बारे में चिंता करने की आवश्यकता नहीं है - docs.microsoft.com/en-us/aspnet/core/tutorials/first-web- एपी
सिमोन_विवर

2
खुशी है कि उन्होंने किया! मैंने लंबे समय से इस बात की भविष्यवाणी की थी कि जिस तरह से गर्वपार्टर.com
blog/

जवाबों:


356

अपने सामान्य विचारों को प्रस्तुत करने के लिए नियंत्रक का उपयोग करें। ApiController कार्रवाई केवल सीरियल और क्लाइंट को भेजे गए डेटा को वापस करती है।

लिंक यहां दिया गया है

उद्धरण:

नोट यदि आपने ASP.NET MVC के साथ काम किया है, तो आप पहले से ही नियंत्रकों से परिचित हैं। वे वेब एपीआई में समान रूप से काम करते हैं, लेकिन वेब एपीआई में नियंत्रक नियंत्रक वर्ग के बजाय एपीकंट्रोलर वर्ग से प्राप्त होते हैं। पहला बड़ा अंतर जो आप देखेंगे, वह यह है कि वेब एपीआई नियंत्रकों पर कार्रवाई के विचार वापस नहीं आते हैं, वे डेटा वापस करते हैं।

ApiControllers डेटा लौटाने में विशेष हैं। उदाहरण के लिए, वे क्लाइंट द्वारा अनुरोधित प्रारूप में डेटा को पारदर्शी रूप से क्रमबद्ध करने का ध्यान रखते हैं। इसके अलावा, वे डिफ़ॉल्ट रूप से एक अलग रूटिंग योजना का पालन करते हैं (जैसे: क्रियाओं के लिए URL मैपिंग), सम्मेलन के लिए REST-ful API प्रदान करता है।

आप शायद कुछ (?) मैनुअल कोडिंग के साथ ApiController के बजाय एक नियंत्रक का उपयोग करके कुछ भी कर सकते हैं। अंत में, दोनों नियंत्रकों ASP.NET नींव पर निर्माण करते हैं। लेकिन REST-ful API होना आज की एक ऐसी सामान्य आवश्यकता है जो WebAPI को ऐसे API के कार्यान्वयन को सरल बनाने के लिए बनाया गया था।

यदि आप HTML आधारित वेब / इंटरनेट / इंट्रानेट एप्लिकेशन लिख रहे हैं तो यह दोनों के बीच तय करना काफी सरल है - शायद कभी-कभार AJAX कॉल रिटर्निंग जसन के साथ यहाँ और वहाँ - MVC / नियंत्रक के साथ रहना। यदि आप किसी सिस्टम को डेटा संचालित / REST-ful इंटरफ़ेस प्रदान करना चाहते हैं, तो WebAPI के साथ जाएं। आप निश्चित रूप से दोनों को जोड़ सकते हैं, एक MVC पृष्ठ से ApiController को AJAX कॉल पूरा करना।

एक वास्तविक दुनिया का उदाहरण देने के लिए: मैं वर्तमान में एक ईआरपी प्रणाली के साथ काम कर रहा हूं जो अपने संस्थानों को REST-ful API प्रदान करती है। इस API के लिए, WebAPI एक अच्छा उम्मीदवार होगा। इसी समय, ईआरपी सिस्टम एक अत्यधिक AJAX- इफाइड वेब एप्लिकेशन प्रदान करता है जिसका उपयोग आप REST-ful API के लिए क्वेरी बनाने के लिए कर सकते हैं। वेब एप्लिकेशन को ही MVC एप्लिकेशन के रूप में लागू किया जा सकता है, जिससे मेटा-डेटा आदि लाने के लिए WebAPI का उपयोग किया जा सकता है।


9
नोट: चूंकि आपका डेटा तार पर भेजा जाएगा, इसलिए इसे कैसे स्वरूपित किया जाएगा? जिस तरह से डेटा एक ApiController रिटर्न स्वरूपित किया जाता है वह सामग्री बातचीत द्वारा निर्धारित किया जाता है, और GlobalConfiguration.Configuration.Formatters ... लिंक: blogs.msdn.com/b/kiranchalla/archive/2012/02/25/…
टिम लोवेल-स्मिथ

1
क्या यह कहना सही है कि वेब एपीआई वेबसाइट, मोबाइल आदि के लिए एक सामान्य मंच है? और हम वेब एपीआई के बजाय क्लास लाइब्रेरी का उपयोग कर सकते हैं?
इमाद अल्जानी

धन्यवाद @ टिमवेलवेल-स्मिथ आपके नोट के लिए, क्योंकि मेरे लिए आंद्रे इस सवाल का जवाब नहीं देता है: एक नियंत्रक के रूप में भी डेटा वापस कर सकता है, यह नहीं बताता है कि ApiController मौजूद क्यों है और उपयोगी है।
JYL

2
@ जेवाईएल I ने अधिक विस्तृत जानकारी प्रदान करने के लिए मेरे उत्तर को बढ़ाया।
आंद्रे लोकर

2
मुझे वास्तव में समझ में नहीं आया जब आपने कहा था "सम्मेलन द्वारा REST-ful API प्रदान करना" । यह REST-ful API कैसे प्रदान करता है? क्या यह इस बात पर निर्भर नहीं करता है कि आप एपीआई से कौन सा डेटा लौटाते हैं? नियंत्रक में कुछ भी नहीं है जो एपीआई (या यहां तक ​​कि सुविधा) एपीआई को रीस्ट-फुल होने के लिए मजबूर करता है।
नवाज

192

जिसे आप लिखेंगे और बनाए रखेंगे?

ASP.NET MVC

public class TweetsController : Controller {
  // GET: /Tweets/
  [HttpGet]
  public ActionResult Index() {
    return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet);
  }
}

ASP.NET वेब एपीआई

public class TweetsController : ApiController {
  // GET: /Api/Tweets/
  public List<Tweet> Get() {
    return Twitter.GetTweets();
  }
}

6
यह एक अच्छी बात है लेकिन ApiController सिर्फ JSON क्रमांकन से अधिक है। यह अनुरोध को देखने और XML को वापस लेने का भी ध्यान रखता है यदि वह स्वीकार प्रकार है।
जेक अलमर

10
यदि आप asp.net कोर का उपयोग करते हैं, तो वे सभी Controllerवर्ग से प्राप्त होते हैं ।
Tân

2
यह पुराने उदाहरण लगता है, अब हमें ApiControllerसिर्फ : Controllerकामों के बारे में चिंता करने की ज़रूरत नहीं है , क्या आप नए डॉट नेट नियंत्रक उदाहरण भी जोड़ सकते हैं
आशीष कांबले

@AishishKamble, ApiController के बजाय, कंट्रोलरबेस का अब उपयोग किया जाता है।
व्लादिमीर शियानोव

ईमानदारी से, मैं इसके बजाय Json()संस्करण होगा। यह स्पष्ट और अधिक स्पष्ट है। मुझे यह पता लगाने की कोशिश में काला जादू का भार पसंद नहीं है कि मेरा कोड किसी अनुरोध का जवाब कैसे दे रहा है।
Jez

27

मुझे इस तथ्य से प्यार है कि ASP.NET Core के MVC6 ने दो पैटर्न को एक में मिला दिया क्योंकि मुझे अक्सर दोनों दुनियाओं का समर्थन करने की आवश्यकता होती है। हालांकि यह सच है कि आप किसी भी मानक MVC Controller(और / या अपनी खुद की ActionResultकक्षाएं विकसित कर सकते हैं) को अभिनय और व्यवहार ApiControllerकर सकते हैं एक की तरह , इसे बनाए रखना और परीक्षण करना बहुत कठिन हो सकता है: उस के शीर्ष पर, नियंत्रकों के तरीकों में ActionResultदूसरों के साथ मिश्रित होना IHttpActionResultयदि आप अकेले काम नहीं कर रहे हैं तो कच्चे / सीरियलाइज्ड / डेटा लौटना एक डेवलपर दृष्टिकोण से बहुत भ्रामक हो सकता है और उस हाइब्रिड दृष्टिकोण के साथ अन्य डेवलपर्स को लाने की आवश्यकता है।

ASP.NET नॉन-कोर वेब एप्लिकेशन में उस समस्या को कम करने के लिए अब तक जो सबसे अच्छी तकनीक आई है वह एमवीसी-आधारित वेब एप्लीकेशन में वेब एपीआई पैकेज को आयात करना (और ठीक से कॉन्फ़िगर करना) है, इसलिए मेरे पास दोनों का सबसे अच्छा हो सकता है दुनिया: Controllersदृश्यों के लिए, ApiControllersडेटा के लिए।

ऐसा करने के लिए, आपको निम्नलिखित कार्य करने होंगे:

  • NuGet का उपयोग करते हुए निम्नलिखित वेब API पैकेज स्थापित करें: Microsoft.AspNet.WebApi.Coreऔर Microsoft.AspNet.WebApi.WebHost
  • अपने /Controllers/फ़ोल्डर में एक या एक से अधिक ApiControllers जोड़ें ।
  • निम्नलिखित WebApiConfig.cs फ़ाइल को अपने /App_Config/फ़ोल्डर में जोड़ें:

using System.Web.Http;

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

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

अंत में, आप अपने को ऊपर वर्ग पंजीकरण करना होगा स्टार्टअप (या तो वर्ग Startup.csया Global.asax.cs, आप Owin स्टार्टअप टेम्पलेट का उपयोग कर या नहीं कर रहे हैं निर्भर करता है)।

Startup.cs

 public void Configuration(IAppBuilder app)
 {
    // Register Web API routing support before anything else
    GlobalConfiguration.Configure(WebApiConfig.Register);

    // The rest of your file goes there
    // ...
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    ConfigureAuth(app);
    // ...
}

Global.asax.cs

protected void Application_Start()
{
    // Register Web API routing support before anything else
    GlobalConfiguration.Configure(WebApiConfig.Register);

    // The rest of your file goes there
    // ...
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    // ...
}

यह दृष्टिकोण - इसके पेशेवरों और विपक्षों के साथ - इस पोस्ट में आगे बताया गया है जो मैंने अपने ब्लॉग पर लिखा था।


1
अच्छी बात। लेकिन यह कार्यक्षमता पहले से ही vs2015 के साथ निर्मित है। यदि आप webapi asp.net प्रोजेक्ट बनाते हैं, तो यह स्वचालित रूप से आपके लिए सभी बॉयलर प्लेट कोड करेगा।
सूओमी-देव

@Darkseal क्या आप इस पर थोड़ा विस्तार कर सकते हैं कि "इसे बनाए रखना और परीक्षण करना बहुत कठिन हो सकता है"? (मैंने आपके ब्लॉग पोस्ट को पढ़ा है) मैंने WebAPI2 का उपयोग किया है और मुझे यह पसंद है कि यह कैसे काम करता है। हालाँकि मैं "वास्तविक बड़े लाभ" का पता लगाने के अलावा "इसे करने का सामान्य तरीका" नहीं कर सकता। क्लासिक एमवीसी नियंत्रकों को "मैन्युअल रूप से" अनुक्रमित तार पर वापस आना काफी आसान है। HTTP स्वीकार क्रिया के साथ json / xml स्विच जोड़ना ज्यादा नहीं लेता है। सभी को एक अच्छी उपयोगिता विधि में लपेटा जा सकता है। धन्यवाद।
ValGe

2
@ValGe, ऊपर @ मनीष-जैन जवाब देखें। संक्षेप में, एक ControllerJson-serialized स्ट्रिंग के भीतर लिपटे हुए लौटना ActionResultनिश्चित रूप से परीक्षण और मंटेन के लिए कठिन है, ApiControllerजिसे सीधे [Serializable]आइटमों की सूची वापस करने के लिए सेट किया जा सकता है । किसी भी परीक्षा विधि को लिखना बहुत आसान होगा, क्योंकि आपको हर बार मैन्युअल रूप से डी-सीरियल करना नहीं होगा: एएसपी.नेट या अन्य फ्रेमवर्क के साथ लगभग किसी भी सिस्टम एकीकरण कार्य के लिए भी यही कहा जा सकता है। Controllersमहान हैं, लेकिन ApiControllersबेहतर कार्यों के लिए बेहतर हैं, कम से कम .NET फ्रेमवर्क 4.x में
Darkseal

1

वेब एपीआई की प्रत्येक विधि बिना क्रमांकन के डेटा (JSON) लौटा देगी।

हालाँकि, MVC नियंत्रकों में JSON डेटा वापस करने के लिए, हम JSONResult में दिए गए एक्शन परिणाम प्रकार को सेट करेंगे और JSON में पैक किया गया है यह सुनिश्चित करने के लिए हमारी वस्तु पर Json विधि को कॉल करें।


1

मुख्य अंतर यह है: वेब एपीआई किसी भी ग्राहक, किसी भी उपकरण के लिए एक सेवा है, और एमवीसी नियंत्रक केवल अपने ग्राहक की सेवा करता है। वही क्योंकि यह एमवीसी प्लेटफॉर्म है।


-1

यदि आप HTML आधारित वेब / इंटरनेट / इंट्रानेट एप्लिकेशन लिख रहे हैं तो यह दोनों के बीच तय करना काफी सरल है - शायद कभी-कभार AJAX कॉल रिटर्निंग जसन के साथ यहाँ और वहाँ - MVC / नियंत्रक के साथ रहना। यदि आप किसी सिस्टम को डेटा संचालित / REST-ful इंटरफ़ेस प्रदान करना चाहते हैं, तो WebAPI के साथ जाएं। आप निश्चित रूप से दोनों को जोड़ सकते हैं, एक MVC पृष्ठ से ApiController को AJAX कॉल पूरा करना। मूल रूप से कंट्रोलर का उपयोग mvc के लिए किया जाता है और एपी-कंट्रोलर का उपयोग रेस्ट- एपीआई के लिए किया जाता है। आप अपनी आवश्यकता के अनुसार एक ही प्रोग्राम में दोनों का उपयोग कर सकते हैं

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