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