Różnica między ApiController i kontrolerem w ASP.NET MVC

grałem z ASP.NET MVC 4 beta i teraz widzę dwa rodzaje sterowników:ApiController a Controller.

Jestem trochę zdezorientowany tym, w jakich sytuacjach mogę wybrać konkretny sterownik.

na przykład: jeśli chcę odzyskać widok, muszę użyć ApiController lub zwykły Controller? Wiem, że web API WCF jest teraz zintegrowany z MVC.

tak jak teraz możemy korzystać z obu kontrolera, może ktoś określić, w jakich sytuacjach iść na odpowiedni kontroler.


użyj kontrolera do wyświetlania zwykłych widoków. ApiController działań zwracać tylko te dane, które są serializowane i wysyłane do klienta.

oto link

cytat:

Uwaga, Jeśli pracowałeś z ASP.NET MVC, wtedy jesteś już zaznajomiony z kontrolerami. Działają one podobnie jak w Web API, ale kontrolery w Web API są pochodne od klasy ApiController zamiast klasy Controller. Pierwsza istotna różnica można zauważyć, że działania na kontrolerach Web API nie zwracają prezentacji, zwracają dane.

ApiControllers przeznaczone na zwrot danych. Na przykład, oni dbają o przezroczystej serializacji danych w formacie zgłoszony przez klienta. Ponadto, domyślnie są one następują innym schemacie routingu (jak w: mapowanie adresów URL z działaniami), zapewniając REST ful API umowy.

można zrobić coś za pomocą kontrolera zamiast ApiController z kilkoma(?) ręczne kodowanie. W końcu oba kontrolery są oparte na ASP.NET fundament. Ale obecność REST ful API jest takim ogólnym wymogiem, że dzisiaj do WebAPI został stworzony w celu ułatwienia realizacji tego API.

bardzo prosta wybrać między nimi: jeśli piszesz aplikację www w oparciu o HTML / internet / intranet-być może z przypadkowym wywołaniem AJAX, który json tu i tam - trzymaj MVC/Controller. Jeśli chcesz zapewnić jadący / REST ful interfejs do systemu, przejdź z WebAPI. Można połączyć oba, oczywiście, mając ApiController obsługuje AJAX-wyzwania ze strony MVC.

aby dać prawdziwy przykład: obecnie pracuję z ERP-system, który dostarcza API REST ful swoim bytom. Do tego API, web API będzie dobrym kandydatem. W tym samym czasie ERP-system usług aplikacji internetowych z wysokim poziomem AJAX, który można użyć do tworzenia zapytań do API REST ful. Sama aplikacja sieci web może być zrealizowany jako aplikacja MVC, wykorzystując do WebAPI do pobierania metadanych itp.


co wolisz pisać i wspierać?

ASP.NET MVC

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

ASP.NET Web API

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

podoba mi się fakt, że ASP.NET Mvc6 jądra połączył dwa szablonu w jeden, bo mi często trzeba wspierać oba światy. Chociaż to prawda, że można ustawić dowolny standardowy MVC Controller (i / lub opracować swój własny ActionResult klasy) działać i zachowywać się tak samo, jak ApiController to może być bardzo trudne do utrzymania i testować: ponadto, mając kontrolery metody zwrotu ActionResult miesza się z innymi, возвращающими raw / serialized/IHttpActionResult dane mogą być bardzo mylące od dewelopera perspektywa, zwłaszcza jeśli pracujesz sam i musi przyspieszyć innych firm z tej hybrydowego podejścia.

najlepsza technika, który przyszedł aż do tej pory, aby zminimalizować ten problem w ASP.NET неосновные aplikacji sieci web muszą importować (i poprawnie skonfigurować) pakiet Web API w aplikacji internetowej w oparciu o MVC, więc mogę mieć najlepsze z obu światów: Controllers dla widoków, ApiControllers dla informacji.

aby to zrobić, musisz zrobić następujący:

  • zainstaluj następujące pakiety sieci web API za pomocą NuGet:Microsoft.AspNet.WebApi.Core a Microsoft.AspNet.WebApi.WebHost.
  • dodaj jeden lub kilka ApiControllers do .
  • dodaj następujący WebApiConfig.cs:

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

wreszcie, trzeba zarejestrować powyższy klasa w swój uruchom klasy (lub Startup.cs lub Global.asax.cs, w zależności od tego, czy używasz OWIN Szablon uruchomić lub nie).

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

globalne.асакс.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);
    // ...
}

ten podejście-wraz z jego plusy i minusy - dalej wyjaśnione w następny post.


każda metoda w Web API zwróci danych (JSON) bez serializacji.

jednak, aby odzyskać dane JSON w kontrolerach MVC, możemy zainstalować typ zwracany jest wynik działania w JsonResult i wezwiemy metoda Json na naszym obiekcie, w celu zapewnienia, że jest on spakowany w formacie JSON.


bardzo prosta wybrać między nimi: jeśli piszesz aplikację www w oparciu o HTML / internet / intranet-być może z przypadkowym wywołaniem AJAX, który json tu i tam - trzymaj MVC/Controller. Jeśli chcesz zapewnić oparty na danych/REST ful interfejs systemu, przejdź do WebAPI. Można połączyć oba, oczywiście, mając ApiController obsługuje AJAX-wyzwania ze strony MVC. Kontroler jest używany głównie do MVC i API-kontroler użyć do wypoczynku- API można użyć zarówno w jednym program jak twoje potrzeby