Pergunta

Tenho brincado com o ASP.NET MVC 4 beta e vejo dois tipos de controladores agora: ApiController e Controller.

Estou um pouco confuso sobre em que situações posso escolher um controlador específico.

Por exemplo:Se eu quiser retornar uma visualização, devo usar ApiController ou o comum Controller?Estou ciente de que a API Web do WCF agora está integrada ao MVC.

Já que agora podemos usar os dois controladores, alguém pode indicar em quais situações usar o controlador correspondente.

Foi útil?

Solução

Use o Controller para renderizar suas visualizações normais.A ação ApiController retorna apenas dados que são serializados e enviados ao cliente.

aqui está o link

Citar:

Nota Se você já trabalhou com ASP.NET MVC, então já está familiarizado com controladores.Eles funcionam de forma semelhante na API Web, mas os controladores na API Web derivam da classe ApiController em vez da classe Controller.A primeira grande diferença que você notará é que as ações nos controladores da API Web não retornam visualizações, elas retornam dados.

ApiControllers são especializados em retornar dados.Por exemplo, eles se encarregam de serializar os dados de forma transparente no formato solicitado pelo cliente.Além disso, eles seguem um esquema de roteamento diferente por padrão (como em:mapeamento de URLs para ações), fornecendo uma API REST por convenção.

Você provavelmente poderia fazer qualquer coisa usando um Controller em vez de um ApiController com a codificação manual some(?).No final, ambos os controladores baseiam-se na base do ASP.NET.Mas ter uma API REST é um requisito tão comum hoje que o WebAPI foi criado para simplificar a implementação de tal API.

É bastante simples decidir entre os dois:se você estiver escrevendo um aplicativo web/internet/intranet baseado em HTML - talvez com chamadas AJAX ocasionais retornando json aqui e ali - use MVC/Controller.Se você deseja fornecer uma interface baseada em dados/REST para um sistema, use WebAPI.Você pode combinar os dois, é claro, fazendo com que um ApiController atenda chamadas AJAX de uma página MVC.

Para dar um exemplo do mundo real:Atualmente estou trabalhando com um sistema ERP que fornece uma API REST para suas entidades.Para esta API, WebAPI seria um bom candidato.Ao mesmo tempo, o sistema ERP fornece um aplicativo da web altamente AJAX que você pode usar para criar consultas para a API REST completa.A própria aplicação web poderia ser implementada como uma aplicação MVC, fazendo uso da WebAPI para buscar metadados, etc.

Outras dicas

O que você prefere escrever e manter?

ASP.NET MVC

public class TweetsController : Controller {
  // GET: /Tweets/
  [HttpGet]
  public ActionResult Index() {
    return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet);
  }
}

API Web ASP.NET

public class TweetsController : ApiController {
  // GET: /Api/Tweets/
  public List<Tweet> Get() {
    return Twitter.GetTweets();
  }
}

Adoro o fato de o MVC6 do ASP.NET Core ter mesclado os dois padrões em um, porque muitas vezes preciso oferecer suporte a ambos os mundos.Embora seja verdade que você pode ajustar qualquer MVC padrão Controller (e/ou desenvolver seu próprio ActionResult aulas) para agir e se comportar como um ApiController, pode ser muito difícil manter e testar:além disso, ter Controladores métodos retornando ActionResult misturado com outros retornando bruto/serializado/IHttpActionResult os dados podem ser muito confusos do ponto de vista do desenvolvedor, especialmente se você não estiver trabalhando sozinho e precisar que outros desenvolvedores acelerem essa abordagem híbrida.

A melhor técnica que encontrei até agora para minimizar esse problema em aplicativos Web ASP.NET não-Core é importar (e configurar adequadamente) o pacote Web API para o aplicativo Web baseado em MVC, para que eu possa ter o melhor de ambos os mundos: Controllers para visualizações, ApiControllers para dados.

Para fazer isso, você precisa fazer o seguinte:

  • Instale os seguintes pacotes de API Web usando NuGet: Microsoft.AspNet.WebApi.Core e Microsoft.AspNet.WebApi.WebHost.
  • Adicione um ou mais ApiControllers ao seu /Controllers/ pasta.
  • Adicione o seguinte WebApiConfig.cs arquivo para o seu /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 }
        );
    }
}

Finalmente, você precisará registrar a classe acima em seu Comece classe (ou Startup.cs ou Global.asax.cs, dependendo se você estiver usando o modelo de inicialização OWIN ou não).

Inicialização.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);
    // ...
}

Esta abordagem - juntamente com os seus prós e contras - é explicada mais detalhadamente em esta postagem Eu escrevi no meu blog.

Cada método na API Web retornará dados (JSON) sem serialização.

No entanto, para retornar dados JSON em controladores MVC, definiremos o tipo de resultado da ação retornado como JsonResult e chamaremos o método Json em nosso objeto para garantir que ele seja empacotado em JSON.

A principal diferença é:A API Web é um serviço para qualquer cliente, qualquer dispositivo, e o MVC Controller atende apenas ao seu cliente.O mesmo porque é uma plataforma MVC.

É bastante simples decidir entre os dois:se você estiver escrevendo um aplicativo web/internet/intranet baseado em HTML - talvez com chamadas AJAX ocasionais retornando json aqui e ali - use MVC/Controller.Se você deseja fornecer uma interface baseada em dados/REST para um sistema, use WebAPI.Você pode combinar os dois, é claro, fazendo com que um ApiController atenda chamadas AJAX de uma página MVC.Basicamente, o controlador é o uso para MVC e API-Controller é o uso da API REST- você pode usar os dois no mesmo programa que sua necessidade

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top