asp.net mvc एएसपी.नेट एमवीसी में एपीकंट्रोलर और कंट्रोलर के बीच अंतर




asp.net-mvc asp.net-web-api (4)

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

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

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

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


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

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

ऐसा करने के लिए, आपको निम्न कार्य करने की आवश्यकता है:

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

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);
    // ...
}

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


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

एएसपी.नेट एमवीसी

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

एएसपी.नेट वेब एपीआई

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

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

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

उद्धरण:

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

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

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

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

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


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

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





asp.net-web-api