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 ActionResult
klasy), 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 / IHttpActionResult
danych 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: Controllers
dla widoków, ApiControllers
dla 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.Core
i 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.cs
albo 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
, aController
wię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