Мені подобається те, що MVC6 ASP.NET Core об'єднав два шаблони в один, бо мені часто потрібно підтримувати обидва світи. Хоча це правда, що ви можете налаштувати будь-який стандартний MVC Controller
(та / або розробити свої власні ActionResult
класи), щоб діяти та вести себе так само, як ApiController
, але це може бути дуже важко підтримувати та перевіряти: на додаток до цього, використовуючи методи Controllers, що повертаються ActionResult
змішаними з іншими повернення необроблених / серіалізованих / IHttpActionResult
даних може бути дуже заплутаним з точки зору розробника, особливо якщо ви не працюєте самотнім і вам потрібно привести інших розробників до швидкості з використанням гібридного підходу.
Найкраща методика, з якою я зайшов, щоб мінімізувати цю проблему в непрофільних веб-додатках ASP.NET - це імпорт (і правильна настройка) пакету веб-API у веб-додаток на базі MVC, тому я можу мати найкраще з обох світи: Controllers
для переглядів, ApiControllers
для даних.
Для цього вам потрібно зробити наступне:
- Встановіть наступні пакети Web API за допомогою NuGet:
Microsoft.AspNet.WebApi.Core
і Microsoft.AspNet.WebApi.WebHost
.
- Додайте до себе один або кілька ApiControllers
/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
, залежно від того, ви використовуєте шаблон запуску OWIN чи ні).
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);
// ...
}
Цей підхід - разом із його плюсами та мінусами - далі пояснюється у цій публікації, яку я написав у своєму блозі.
ApiController
іController
тому, якщо ви використовуєте новіший .NET, вам більше не потрібно турбуватися про ApiController - docs.microsoft.com/en-us/aspnet/core/tutorials/first-web- api