এএসপি.এনইটি এমভিসিতে এপিআইকন্ট্রোলার এবং কন্ট্রোলারের মধ্যে পার্থক্য


343

আমি এএসপি.নেট এমভিসি 4 বিটার সাথে ঘুরে বেড়াচ্ছি এবং আমি এখন দুটি ধরণের নিয়ামক দেখতে পাচ্ছি: ApiControllerএবং Controller

আমি কোন বিশেষ নিয়ামক চয়ন করতে পারি সে পরিস্থিতিতে আমি কিছুটা বিভ্রান্ত।

উদাহরণস্বরূপ: আমি যদি কোনও ভিউ ফিরে আসতে চাই তবে আমি ব্যবহার করব ApiControllerনাকি সাধারণ Controller? আমি জানি যে ডাব্লুসিএফ ওয়েব এপিআই এখন এমভিসির সাথে সংহত হয়েছে।

যেহেতু আমরা উভয় নিয়ামক ব্যবহার করতে পারি যে কেউ দয়া করে নির্দেশ করতে পারেন যে কোন পরিস্থিতিতে সংশ্লিষ্ট নিয়ামকের জন্য যেতে হবে।


23
গুরুত্বপূর্ণ: এএসপনেট কোরটি 'একীভূত' হয়েছে ApiControllerএবং Controllerতাই আপনি যদি নতুনটি ব্যবহার করেন তবে নেট অ্যাপ্লিকেশনটিকে আপনার আর চিন্তার দরকার নেই - ডকস.মাইক্রোসফট
সাইমন_ ওয়েভার

2
তারা খুশি! আমি এটিকে অনেক আগেই ভবিষ্যদ্বাণী করেছি প্রিন্সপায়ারট
ব্লগ /

উত্তর:


356

আপনার স্বাভাবিক দর্শনগুলি রেন্ডার করতে নিয়ামক ব্যবহার করুন। এপিআইকন্ট্রোলার অ্যাকশন কেবল এমন ডেটা ফেরত দেয় যা ক্রিয়াকলাপযুক্ত এবং ক্লায়েন্টকে প্রেরণ করা হয়।

এখানে লিঙ্কটি

উদ্ধৃতি:

দ্রষ্টব্য আপনি যদি এএসপি.নেট এমভিসির সাথে কাজ করে থাকেন তবে আপনি ইতিমধ্যে নিয়ন্ত্রণকারীদের সাথে পরিচিত। তারা ওয়েব এপিআই তে একইভাবে কাজ করে তবে ওয়েব এপিআইতে নিয়ন্ত্রণকারীরা কন্ট্রোলার শ্রেণির পরিবর্তে এপিআইকন্ট্রোলার শ্রেণি থেকে প্রাপ্ত। আপনি যে প্রথম প্রধান পার্থক্যটি লক্ষ্য করবেন তা হ'ল ওয়েব এপিআই কন্ট্রোলারগুলির ক্রিয়াকলাপগুলি দর্শন দেয় না, তারা ডেটা ফেরত দেয়।

অ্যাপিকন্ট্রোলাররা ডেটা ফেরত দেওয়ার ক্ষেত্রে বিশেষজ্ঞ। উদাহরণস্বরূপ, তারা ক্লায়েন্টের দ্বারা অনুরোধ করা ফর্ম্যাটে ডেটা স্বচ্ছভাবে সিরিয়ালকরণের যত্ন নেয়। এছাড়াও, তারা ডিফল্টরূপে একটি পৃথক রাউটিং স্কিম অনুসরণ করে (যেমন: ক্রিয়ায় ইউআরএলগুলি ম্যাপিং করে), কনভেনশনের মাধ্যমে একটি REST-পূর্ণ API সরবরাহ করে।

আপনি সম্ভবত কিছু (?) ম্যানুয়াল কোডিংয়ের সাথে অ্যাপি কন্ট্রোলারের পরিবর্তে একটি নিয়ামক ব্যবহার করে কিছু করতে পারেন। শেষ পর্যন্ত, উভয় নিয়ামকই এএসপি.এনইটি ফাউন্ডেশনের উপর ভিত্তি করে তৈরি করে। তবে একটি রেস্ট-ফুল এপিআই থাকা আজ এমন একটি সাধারণ প্রয়োজন যে এ জাতীয় একটি এপিআই বাস্তবায়নকে সহজ করার জন্য ওয়েবএপিআই তৈরি করা হয়েছিল।

দুজনের মধ্যে সিদ্ধান্ত নেওয়া মোটামুটি সহজ: আপনি যদি এইচটিএমএল ভিত্তিক ওয়েব / ইন্টারনেট / ইন্ট্রানেট অ্যাপ্লিকেশন লিখেন - তবে মাঝে মাঝে এজেএক্স কল রিটার্নিং জেসন এখানে এবং সেখানে - এমভিসি / কন্ট্রোলারের সাথে লেগে থাকুন। আপনি যদি কোনও সিস্টেমে কোনও ডেটা চালিত / REST-ফুল ইন্টারফেস সরবরাহ করতে চান তবে ওয়েবএপিআইয়ের সাথে যান। আপনি উভয়ই একত্রিত করতে পারেন, অবশ্যই একটি এমভিসি পৃষ্ঠা থেকে একটি অ্যাপিএকন্ট্রোলার কেটার এজেএক্স কল রয়েছে।

সত্যিকারের বিশ্বের উদাহরণ দেওয়ার জন্য: আমি বর্তমানে একটি ইআরপি সিস্টেমের সাথে কাজ করছি যা এর সত্তাগুলিকে একটি রেস্ট-ফুল এপিআই সরবরাহ করে। এই এপিআই এর জন্য, ওয়েবএপিআই একটি ভাল প্রার্থী হবে। একই সময়ে, ERP সিস্টেম একটি উচ্চতর AJAX-ified ওয়েব অ্যাপ্লিকেশন সরবরাহ করে যা আপনি রেস্ট-ফুল এপিআই এর জন্য অনুসন্ধান তৈরি করতে ব্যবহার করতে পারেন। ওয়েব অ্যাপ্লিকেশনটি এমভিসি অ্যাপ্লিকেশন হিসাবে প্রয়োগ করা যেতে পারে, মেটা-ডেটা আনার জন্য ওয়েবএপিআই ব্যবহার করে etc.


9
দ্রষ্টব্য: যেহেতু আপনার ডেটা তারের মাধ্যমে প্রেরণ করা হবে, এটি কীভাবে বিন্যাস করা হবে? কোনও এপিআইআর কনট্রোলার যে উপায়ে ফর্ম্যাট করে তা বিষয়বস্তু আলোচনার মাধ্যমে নির্ধারণ করা হয় এবং GlobalConfigration.Configration. Formatters
টিম

1
ওয়েব এপিআই ওয়েবসাইট, মোবাইল ইত্যাদির জন্য একটি সাধারণ প্ল্যাটফর্ম তা বলা কি সঠিক? এবং আমরা ওয়েব API এর পরিবর্তে ক্লাস লাইব্রেরি ব্যবহার করতে পারি?
ইমাদ আলাজানী

আপনার নোটের জন্য @ টিমলভেল-স্মিথকে ধন্যবাদ, কারণ আমার জন্য আন্দ্রে এই প্রশ্নের উত্তর দেয় না: একজন নিয়ামক যেমন ডেটাও ফেরত দিতে পারেন, কেন এপিআইকন্ট্রোলার বিদ্যমান এবং এটি কার্যকর তা ব্যাখ্যা করে না।
JYL

2
@ জাইওয়াইএল আমি আরও উত্তর সরবরাহ করার জন্য আমার উত্তরটি বাড়িয়েছি।
আন্দ্রে লোকার

2
যখন আপনি "কনভেনশন দ্বারা একটি REST- ফুল এপিআই সরবরাহ করে" বলেছিলেন তখন আমি সত্যিই বুঝতে পারি নি । এটি কীভাবে রেস্ট-ফুল এপিআই সরবরাহ করে? আপনি এপিআই থেকে কোন ডেটা ফেরান তার উপর নির্ভর করে না? নিয়ামক এমন কিছুই নেই যা API টি REST- পরিপূর্ণ হতে বাধ্য করে (বা এমনকি সুবিধার্থে)।
নওয়াজ

192

আপনি বরং লিখতে এবং রক্ষণাবেক্ষণ করতে চান?

এএসপি.নেট এমভিসি

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
এটি একটি ভাল পয়েন্ট তবে এপিসিন্ট্রোলার কেবল জেএসএন সিরিয়ালাইজেশনের চেয়ে বেশি। এটি অনুরোধটি দেখার এবং এক্সএমএলটি ফিরে পাওয়ার ক্ষেত্রে যদি এটি গ্রহণযোগ্য ধরণের হয় তবে এটিও যত্ন নেয়।
জেক অ্যালমার

10
আপনি যদি এসপ নেট কোর ব্যবহার করেন তবে সেগুলি সমস্ত Controllerশ্রেণি থেকে নেওয়া ।
Tân

2
এটি পুরানো উদাহরণ বলে মনে হচ্ছে, এখন আমাদের ApiControllerশুধু : Controllerকাজ সম্পর্কে চিন্তা করার দরকার নেই , আপনি কি নতুন ডট নেট কোর কন্ট্রোলারের উদাহরণও যুক্ত করতে পারেন
আশীষ কাম্বলে

@ আশিষ ক্যাম্বল, এপি কন্ট্রোলারের পরিবর্তে কন্ট্রোলারবেস এখন ব্যবহৃত হয়েছে।
ভ্লাদিমির শায়ানভ

সত্যি বলতে, আমি বরং Json()সংস্করণটি চাই । এটি পরিষ্কার এবং আরও স্পষ্ট। আমার কোড কীভাবে কোনও অনুরোধের প্রতিক্রিয়া জানাতে চলেছে তা নির্ধারণের চেষ্টা করার জন্য আমি কালো জাদুতে বোঝা পছন্দ করি না।
জেজ

27

আমি সত্যটি পছন্দ করি যে এএসপি.নেট কোরের এমভিসি 6 দুটি প্যাটার্নগুলিকে এক করে নিয়েছে কারণ আমার প্রায়শই উভয় বিশ্বকে সমর্থন করা প্রয়োজন। যদিও এটি সত্য যে আপনি যে কোনও মানক এমভিসি Controller(এবং / অথবা নিজের ActionResultশ্রেণীর বিকাশ ) ঠিক যেমনটির মতো আচরণ এবং আচরণ ApiControllerকরতে পারেন তা বজায় রাখা এবং পরীক্ষা করা খুব কঠিন হতে পারে: তার উপরে, কন্ট্রোলার পদ্ধতিগুলি ActionResultঅন্যের সাথে মিশ্রিত হওয়া আবারও থাকতে পারে having IHttpActionResultবিকাশকারী দৃষ্টিকোণ থেকে কাঁচা / সিরিয়ালাইজড / ডেটা ফিরিয়ে দেওয়া খুব বিভ্রান্তিকর হতে পারে, বিশেষত যদি আপনি একা কাজ করছেন না এবং অন্য বিকাশকারীদের সেই সংকর পদ্ধতির সাথে গতি আনার প্রয়োজন হয়।

এএসপি.নেট নন-কোর ওয়েব অ্যাপ্লিকেশনগুলিতে এই সমস্যাটি হ্রাস করার জন্য আমি এখন পর্যন্ত যে সেরা কৌশলটি এসেছি তা হ'ল এমভিসি ভিত্তিক ওয়েব অ্যাপ্লিকেশনটিতে ওয়েব এপিআই প্যাকেজটি আমদানি করা (এবং সঠিকভাবে কনফিগার করা), সুতরাং আমি উভয়ের মধ্যে সেরাটি পেতে পারি ওয়ার্ল্ডস: Controllersভিউ ApiControllersজন্য, ডেটা জন্য।

এটি করার জন্য, আপনাকে নিম্নলিখিতগুলি করতে হবে:

  • নিউগেট: 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আপনি ওউইন স্টার্টআপ টেম্পলেট ব্যবহার করছেন কিনা তা নির্ভর করে)।

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 এর সাথে অন্তর্নির্মিত। আপনি যদি ওয়েবাপি এসপ নেট প্রকল্পটি তৈরি করেন তবে এটি স্বয়ংক্রিয়ভাবে আপনার জন্য সমস্ত বয়লার প্লেট কোড করবে।
suomi-dev

@ ডার্কসিল আপনি কি দয়া করে "এটি বজায় রাখা এবং পরীক্ষা করা খুব কঠিন হতে পারে" তার উপর কিছুটা ব্যাখ্যা করতে পারেন? (আমি আপনার ব্লগ পোস্টটি পড়েছি) আমি ওয়েবএপিআই 2 ব্যবহার করেছি এবং এটি কীভাবে কাজ করে তা আমার পছন্দ হয়। তবে "জিনিসগুলি করার সাধারণ উপায়" থাকা ছাড়াও আমি "আসল বড় সুবিধা" খুঁজে বের করতে পারি না। ক্লাসিক এমভিসি কন্ট্রোলারদের "ম্যানুয়ালি" সিরিয়ালযুক্ত স্ট্রিং ফিরিয়ে দেওয়া যথেষ্ট সহজ। HTTP স্বীকার ক্রিয়া সহ একটি জেসন / এক্সএমএল সুইচ যুক্ত করা বেশি লাগে না doesn't যেগুলি একটি দুর্দান্ত ইউটিলিটি পদ্ধতিতে মোড়ানো হতে পারে han ধন্যবাদ।
ভালজি

2
@ ভালজি, উপরে @ মণীশ-জাইন উত্তর দেখুন। সংক্ষেপে, একটি Controllerজাসন-সিরিয়ালাইজড স্ট্রিংটি একটিতে আবৃত করা একটি ফিরে আসার ActionResultচেয়ে অবশ্যই পরীক্ষা করা এবং ম্যানটেনের চেয়ে শক্ত, ApiControllerযা [Serializable]আইটেমের একটি তালিকা সরাসরি ফেরত দিতে সেট করা যেতে পারে । যে কোনও পরীক্ষার পদ্ধতি লিখতে অনেক সহজ হবে, কারণ আপনাকে প্রতিটি সময় ম্যানুয়ালি ডি-সিরিয়ালাইজ করতে হবে না: এএসপি.এনইটি বা অন্যান্য ফ্রেমওয়ার্কগুলির সাথে প্রায় কোনও সিস্টেম ইন্টিগ্রেশন টাস্কের ক্ষেত্রেও একই কথা বলা যেতে পারে। Controllersমহান, কিন্তু ApiControllersভাল, RESTful কাজের জন্য উপযোগী হয় অন্তত .NET ফ্রেমওয়ার্ক 4.x মধ্যে
Darkseal

1

ওয়েব এপিআইয়ের প্রতিটি পদ্ধতি সিরিয়ালাইজেশন ছাড়াই ডেটা (জেএসএন) ফিরিয়ে দেবে।

তবে, এমভিসি নিয়ন্ত্রণকারীগুলিতে জেএসএন ডেটা ফেরত দেওয়ার জন্য, আমরা জেসনআরসাল্টে ফিরে আসা অ্যাকশন ফলাফলের ধরণটি সেট করব এবং এটি জেএসএন-এ প্যাকেজড রয়েছে তা নিশ্চিত করার জন্য আমাদের বস্তুতে জসন পদ্ধতিটি কল করব।


1

মূল পার্থক্যটি হ'ল: ওয়েব এপিআই হ'ল যে কোনও ক্লায়েন্ট, যেকোন ডিভাইস এবং এমভিসি কন্ট্রোলার কেবল তার ক্লায়েন্টকে পরিবেশন করে। একই কারণ এটি এমভিসি প্ল্যাটফর্ম।


-1

দুজনের মধ্যে সিদ্ধান্ত নেওয়া মোটামুটি সহজ: আপনি যদি এইচটিএমএল ভিত্তিক ওয়েব / ইন্টারনেট / ইন্ট্রানেট অ্যাপ্লিকেশন লিখেন - তবে মাঝে মাঝে এজেএক্স কল রিটার্নিং জেসন এখানে এবং সেখানে - এমভিসি / কন্ট্রোলারের সাথে লেগে থাকুন। আপনি যদি কোনও সিস্টেমে কোনও ডেটা চালিত / REST-ফুল ইন্টারফেস সরবরাহ করতে চান তবে ওয়েবএপিআইয়ের সাথে যান। আপনি উভয়ই একত্রিত করতে পারেন, অবশ্যই একটি এমভিসি পৃষ্ঠা থেকে একটি অ্যাপিএকন্ট্রোলার কেটার এজেএক্স কল রয়েছে। মূলত কন্ট্রোলারটি এমভিসি-র জন্য ব্যবহৃত হয় এবং এপিআই-কন্ট্রোলারটি রেস্ট-এপিআই-র জন্য ব্যবহৃত হয় আপনি আপনার প্রয়োজন হিসাবে একই প্রোগ্রামে উভয়ই ব্যবহার করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.