2012-02-29 26 views
266

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

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

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

अब से हम दोनों नियंत्रकों का उपयोग कर सकते हैं कृपया किसी को बताएं कि कौन सी स्थितियों को संबंधित नियंत्रक के लिए जाना है।

+5

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

+0

उन्होंने देखा है! मैंने इस लंबे समय से http://prideparrot.com/blog/archive/2012/10/asp_net_mvc_vs_webapi – VJAI

उत्तर

273

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

here is the link

उद्धरण:

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

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

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

दोनों के बीच फैसला करना काफी आसान है: यदि आप एक HTML आधारित वेब/इंटरनेट/इंट्रानेट एप्लिकेशन लिख रहे हैं - शायद कभी-कभी AJAX कॉल जेसन को यहां और वहां लौटाने के साथ - एमवीसी/नियंत्रक के साथ चिपके रहें। यदि आप किसी सिस्टम को डेटा संचालित/आरईएसटी-पूर्ण इंटरफ़ेस प्रदान करना चाहते हैं, तो वेबएपीआई के साथ जाएं। आप निश्चित रूप से दोनों को जोड़ सकते हैं, एक एपीकंट्रोलर एक एमवीसी पेज से AJAX कॉल को पूरा कर सकता है।

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

+9

नोट की भविष्यवाणी की है नोट: चूंकि आपका डेटा तार पर भेजा जाएगा, इसे प्रारूपित कैसे किया जाएगा? जिस तरीके से एपीकंट्रोलर रिटर्न स्वरूपित होता है वह सामग्री वार्तालाप द्वारा निर्धारित होता है, और ग्लोबल कॉन्फ़िगरेशन। कॉन्फ़िगरेशन। फॉर्मेटर्स ... लिंक: http://blogs.msdn.com/b/kiranchalla/archive/2012/02/25/content- बातचीत-इन-एएसपी-नेट-एमवीसी 4-वेब-एपीआई-बीटा-भाग -1 1.aspx –

+1

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

+0

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

140

आप लिखना और बनाए रखना चाहते हैं?

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(); 
    } 
} 
+2

तो अच्छी तरह से समझाया !! धन्यवाद। – himanshupareek66

+2

यह एक अच्छा मुद्दा है लेकिन एपीकंट्रोलर सिर्फ जेएसओएन क्रमबद्धता से अधिक है। यह अनुरोध को देखने और एक्सएमएल लौटने पर भी ध्यान देता है अगर यह स्वीकार्य प्रकार है। –

+3

यदि आप एएसपीनेट कोर का उपयोग करते हैं, तो वे सभी 'नियंत्रक' वर्ग से व्युत्पन्न होते हैं। –

16

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

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

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

  • NuGet का उपयोग कर स्थापित करें निम्नलिखित वेब एपीआई संकुल: Microsoft.AspNet.WebApi.Core और Microsoft.AspNet.WebApi.WebHost
  • अपने /Controllers/ फ़ोल्डर में एक या अधिक एपीकंट्रोलर जोड़ें।
  • निम्नलिखित 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); 
    // ... 
} 

यह दृष्टिकोण - एक साथ अपने पक्ष-विपक्ष के साथ - आगे the following post से समझाया गया है।

1

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

हालांकि, एमवीसी नियंत्रकों में जेएसओएन डेटा वापस करने के लिए, हम वापस लौटाए गए एक्शन परिणाम प्रकार को जेसनआरसल्ट पर सेट करेंगे और जेसन में पैक किए गए यह सुनिश्चित करने के लिए जेसन विधि को हमारे ऑब्जेक्ट पर कॉल करेंगे।

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