Uwielbiam fakt, że MVC6 programu ASP.NET Core połączył oba wzorce w jeden, ponieważ często muszę obsługiwać oba światy. Chociaż prawdą jest, że możesz dostosować dowolny standardowy MVC Controller(i / lub opracować własne ActionResultklasy), aby zachowywał się i zachowywał tak jak on ApiController, może być jednak bardzo trudny do utrzymania i przetestowania: na dodatek mieszanie metod kontrolerówActionResult z innymi zwracanie nieprzetworzonych / zserializowanych / IHttpActionResultdanych może być bardzo mylące z punktu widzenia programisty, szczególnie jeśli nie pracujesz sam i potrzebujesz przyspieszyć innych programistów dzięki temu hybrydowemu podejściu.
Najlepszą techniką, jaką do tej pory doszedłem do zminimalizowania tego problemu w nie-podstawowych aplikacjach internetowych ASP.NET, jest zaimportowanie (i poprawne skonfigurowanie) pakietu Web API do aplikacji internetowej opartej na MVC, dzięki czemu mogę mieć to, co najlepsze z obu światy: Controllersdla widoków, ApiControllersdla danych.
Aby to zrobić, musisz wykonać następujące czynności:
- Zainstaluj następujące pakiety interfejsu API sieci Web za pomocą NuGet:
Microsoft.AspNet.WebApi.Corei Microsoft.AspNet.WebApi.WebHost.
- Dodaj jeden lub więcej ApiControllerów do swojego
/Controllers/folderu.
- Dodaj następujący plik WebApiConfig.cs do swojego
/App_Config/folderu:
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ższą klasę do uruchomienia klasy (albo Startup.csalbo Global.asax.cs, zależnie od tego czy używasz szablonu OWIN startowy lub 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);
// ...
}
Podejście to - wraz z jego zaletami i wadami - wyjaśniono szerzej w tym poście, który napisałem na moim blogu.
ApiController, aControllerwięc jeśli używasz nowszej .NET nie trzeba się martwić o ApiController już - docs.microsoft.com/en-us/aspnet/core/tutorials/first-web- api