Różnica między Apicontrollerem a kontrolerem w ASP.NET MVC

I ' ve been playing around with ASP.NET MVC 4 beta i widzę teraz dwa typy kontrolerów: ApiController i Controller.

Nie wiem, w jakich sytuacjach mogę wybrać konkretny kontroler.

For ex: jeśli chcę zwrócić Widok, to muszę użyć ApiController lub zwykłego Controller? Wiem, że WCF Web API jest teraz zintegrowany z MVC.

Od teraz możemy używać obu kontrolerów czy ktoś może wskazać w jakich sytuacjach przejść do odpowiedniego kontrolera.

Author: gideon, 2012-02-29

5 answers

Użyj kontrolera do renderowania normalnych widoków. Akcja ApiController zwraca tylko dane serializowane i wysyłane do klienta.

Oto link

Cytat:

Uwaga jeśli pracowałeś z ASP.NET MVC, wtedy jesteś już zaznajomiony ze sterownikami. Działają podobnie w Web API, ale Kontrolery w Web API wywodzą się z klasy ApiController zamiast klasy kontrolera. Pierwszą dużą różnicą, którą zauważysz, jest to, że działania w Web API Kontrolery nie zwracają widoków, zwracają dane.

Apicontrollery specjalizują się w zwracaniu danych. Na przykład dbają o transparentną serializację danych do formatu żądanego przez Klienta. Ponadto domyślnie kierują się innym schematem routingu (jak w: mapowanie adresów URL do akcji), zapewniając interfejs API REST-ful według konwencji.

Prawdopodobnie możesz zrobić wszystko używając kontrolera zamiast Apicontrollera z some(?) kodowanie ręczne. W końcu, zarówno Kontrolery bazują na ASP.NET Fundacja. Ale posiadanie REST-ful API jest dziś tak powszechnym wymogiem, że WebAPI zostało stworzone w celu uproszczenia implementacji takiego API.

Jest to dość proste, aby zdecydować między nimi: jeśli piszesz HTML oparte web/internet/intranet aplikacji-może z okazjonalnych połączeń AJAX zwracając json tu i ówdzie-trzymaj się MVC / Controller. Jeśli chcesz zapewnić systemowi interfejs oparty na danych/REST-ful, skorzystaj z WebAPI. Możesz połącz oba, oczywiście, mając ApiController obsługujący połączenia AJAX ze strony MVC.

Aby podać przykład z prawdziwego świata: obecnie pracuję z systemem ERP, który zapewnia Rest-ful API dla swoich podmiotów. Dla tego API WebAPI byłby dobrym kandydatem. Jednocześnie system ERP zapewnia wysoce AJAX-ified aplikacji internetowej, które można wykorzystać do tworzenia zapytań dla Rest-ful API. Sama aplikacja webowa może być zaimplementowana jako aplikacja MVC, wykorzystując WebAPI do pobieranie metadanych itp.

 297
Author: Andre Loker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-03 20:34:44

Co wolisz pisać i utrzymywać?

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();
  }
}
 158
Author: Manish Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-16 13:18:44

Kocham fakt, że ASP.NET Core MVC6 połączył dwa wzorce w jeden, ponieważ często muszę obsługiwać oba światy. Chociaż prawdą jest, że można dostosować dowolny standardowy MVC Controller (i / lub stworzyć własne ActionResult klasy) tak, aby działał i zachowywał się jak ApiController, może to być bardzo trudne do utrzymania i przetestowania: Ponadto, posiadanie kontrolerów metod zwracającychActionResult zmieszanych z innymi zwracającymi surowe/serializowane / IHttpActionResult dane mogą być bardzo mylące z punktu widzenia programisty, szczególnie jeśli nie pracujesz sam i musisz przyspieszyć działanie innych programistów dzięki temu hybrydowemu podejściu.

Najlepsza technika, jaką do tej pory osiągnąłem, aby zminimalizować ten problem w ASP.NET nie-Core web applications polega na zaimportowaniu (i prawidłowej konfiguracji) pakietu Web API do aplikacji webowej opartej na MVC, dzięki czemu mogę mieć to, co najlepsze z obu światów: {[8] } dla widoków, ApiControllers dla danych.

Aby to zrobić, musisz wykonać następujące czynności:

  • zainstaluj następujące pakiety Web API używając NuGet: Microsoft.AspNet.WebApi.Core i Microsoft.AspNet.WebApi.WebHost.
  • Dodaj jeden lub więcej kontrolerów Apicontroller do folderu /Controllers/.
  • Dodaj następujący WebApiConfig.plik cs do folderu /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 }
        );
    }
}

Na koniec musisz zarejestrować powyższą klasę do swojej klasyStartup (albo Startup.cs lub Global.asax.cs, w zależności od tego, czy używasz szablonu startowego OWIN, czy nie).

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

To podejście-wraz z jego zaletami i wadami - zostało wyjaśnione w w następującym poście.

 21
Author: Darkseal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-11 15:32:29

Każda metoda W Web API zwróci dane (JSON) bez serializacji.

Jednakże, w celu zwrócenia danych JSON w kontrolerach MVC, ustawimy Typ wyniku zwracanej akcji na JsonResult i wywołamy metodę Json na naszym obiekcie, aby upewnić się, że jest ona zapakowana w JSON.

 1
Author: Shailesh Uke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-20 04:16:01

Jest to dość proste, aby zdecydować między nimi: jeśli piszesz HTML oparte web/internet/intranet aplikacji-może z okazjonalnych połączeń AJAX zwracając json tu i ówdzie-trzymaj się MVC / Controller. Jeśli chcesz zapewnić systemowi interfejs oparty na danych/REST-ful, skorzystaj z WebAPI. Możesz połączyć oba, oczywiście, mając apicontroller obsługujący połączenia AJAX ze strony MVC. Zasadniczo kontroler jest używany do mvc i api-kontroler jest używany do Rest- API można używać zarówno w tym samym program jako twoja potrzeba

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-24 11:47:17