Мне нравится тот факт, что ASP.NET Core MVC6 объединил два шаблона в один, потому что мне часто нужно поддерживать оба мира. Хотя это правда, что вы можете настроить любой стандартный MVC Controller
(и / или разработать свои собственные ActionResult
классы) так, чтобы он действовал и вел себя так же, как и его ApiController
, его очень сложно поддерживать и тестировать: кроме того, методы Controllers возвращают ActionResult
смешанные с другими Возвращение необработанных / сериализованных / IHttpActionResult
данных может быть очень запутанным с точки зрения разработчика, особенно если вы работаете не в одиночку и вам необходимо ускорить работу других разработчиков с помощью этого гибридного подхода.
Лучший способ, который я до сих пор использовал, чтобы минимизировать эту проблему в неосновных веб-приложениях ASP.NET, - это импортировать (и правильно настроить) пакет веб-API в веб-приложение на основе MVC, чтобы я мог использовать оба миры: Controllers
для представлений, ApiControllers
для данных.
Для этого вам необходимо сделать следующее:
- Установите следующие пакеты веб-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