Adoro o fato de o MVC6 do ASP.NET Core mesclar os dois padrões em um, porque muitas vezes preciso oferecer suporte aos dois mundos. Embora seja verdade que você pode ajustar qualquer MVC padrão Controller(e / ou desenvolver suas próprias ActionResultclasses) para agir e se comportar como um ApiController, pode ser muito difícil de manter e testar: além disso, ter métodos de Controladores retornando ActionResultmisturados com outros retornar dados brutos / serializados / IHttpActionResultpode ser muito confuso do ponto de vista do desenvolvedor, principalmente se você não estiver trabalhando sozinho e precisar levar outros desenvolvedores a acelerar essa abordagem híbrida.
A melhor técnica que eu vim até agora para minimizar esse problema em aplicativos da Web não-essenciais do ASP.NET é importar (e configurar corretamente) o pacote da API da Web no aplicativo da Web baseado em MVC, para que eu possa ter o melhor de ambos mundos: Controllerspara Views, ApiControllerspara dados.
Para fazer isso, você precisa fazer o seguinte:
- Instale os seguintes pacotes de API da Web usando o NuGet:
Microsoft.AspNet.WebApi.Coree Microsoft.AspNet.WebApi.WebHost.
- Adicione um ou mais ApiControllers à sua
/Controllers/pasta.
- Adicione o seguinte arquivo WebApiConfig.cs à sua
/App_Config/pasta:
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 }
);
}
}
Por fim, você precisará registrar a classe acima na sua Inicialização classe ( Startup.csou Global.asax.cs, dependendo se você estiver usando o modelo de inicialização OWIN ou não).
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);
// ...
}
Essa abordagem - junto com seus prós e contras - é explicada mais detalhadamente neste post que escrevi no meu blog.
ApiControllere,Controllerportanto, se você estiver usando o .NET mais recente, não precisará mais se preocupar com o ApiController - docs.microsoft.com/en-us/aspnet/core/tutorials/first-web- api