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 ActionResult
classes) 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 ActionResult
misturados com outros retornar dados brutos / serializados / IHttpActionResult
pode 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: Controllers
para Views, ApiControllers
para dados.
Para fazer isso, você precisa fazer o seguinte:
- Instale os seguintes pacotes de API da Web usando o NuGet:
Microsoft.AspNet.WebApi.Core
e 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.cs
ou 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.
ApiController
e,Controller
portanto, 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