Como adicionar API da Web a um projeto de aplicativo da Web ASP.NET MVC (5) existente?

146

Supondo que você esqueceu de marcar a caixa de seleção API da Web (adicione-a ao projeto) ao criar um novo projeto MVC (5), o que você precisa para adicionar a API da Web e fazê-la funcionar?

Há várias perguntas sobre migração, mas nenhuma parecia ter as etapas completas e atualizadas para adicionar API da Web a um projeto MVC 5 e parece ter mudado de algumas das respostas antigas.

Adicionar API da Web ao MVC 4

Adicionando MVC GlobalConfiguration.Configure (WebApiConfig.Register)

lko
fonte

Respostas:

253

Atualize o projeto MVC

Use o Nuget para obter a API da Web mais recente.

Projeto - Clique com o botão direito do mouse - Gerenciar pacotes de nuget - Pesquise API da Web (Microsoft ASP.NET Web API ...) e instale-a no seu projeto MVC.

Então você ainda precisa fazer o roteamento da API da Web funcionar. Da Microsoft Configurando o ASP.NET Web API 2

Adicione WebApiConfig.cs à pasta App_Start /

using System.Web.Http;

namespace WebApplication1
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // TODO: Add any additional configuration code.

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

        // WebAPI when dealing with JSON & JavaScript!
        // Setup json serialization to serialize classes to camel (std. Json format)
        var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
        formatter.SerializerSettings.ContractResolver =
            new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
        }
    }
}

Se você tiver um projeto MVC, ele terá Global.asax.cs , adicione as novas rotas. A ordem das rotas Global.asax.cs é crítica. Observe que existem exemplos desatualizados que usam WebApiConfig.Register

Adicione esta linha ao Global.asax.cs: GlobalConfiguration.Configure(WebApiConfig.Register);

protected void Application_Start()
{
    // Default stuff
    AreaRegistration.RegisterAllAreas();

    // Manually installed WebAPI 2.2 after making an MVC project.
    GlobalConfiguration.Configure(WebApiConfig.Register); // NEW way
    //WebApiConfig.Register(GlobalConfiguration.Configuration); // DEPRECATED

    // Default stuff
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

Ajuda do WebAPI

Para obter as páginas de ajuda da WebAPI ( muito ) úteis , instale o WebAPI.HelpPage. Consulte http://channel9.msdn.com/Events/Build/2014/3-644 (~ 42 minutos) para saber o que ele faz. Parece muito útil!

Console Nuget: Install-Package Microsoft.AspNet.WebApi.HelpPage

Para verificar se a WebAPI está funcionando:

Para a pasta controladores -> Adicionar novo item -> Classe de Controlador de API da Web.

public class TestController : ApiController
{
    //public TestController() { }

    // GET api/<controller>
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/<controller>/5
    public string Get(int id)
    {
        return "value";
    }
    //...
}

Agora você pode testar no IE / FF / Chrome, como de costume, ou nos consoles JavaScript para testes sem obtenção.

(Com apenas o controlador na URL, ele chamará a ação GET () no novo Web API Controller, ele será automaticamente mapeado para métodos / ações, dependendo do REST, por exemplo, PUT / POST / GET / DELETE. Você não precisa chamar eles por ação como no MVC) O URL diretamente:

http://localhost:PORT/api/CONTROLLERNAME/

Como alternativa, use o jQuery para consultar o controlador. Execute o projeto, abra o console (F12 no IE) e tente executar uma consulta Ajax. (Verifique seu PORT & CONTROLLERNAME)

$.get( "http://localhost:PORT/api/CONTROLLERNAME/", function( data ) {
    //$( ".result" ).html( data );
    alert( "Get data received:" + data);
});

Nota lateral: Existem alguns prós / contras a serem considerados ao combinar MVC e API da Web em um projeto

Verificação da Ajuda do WebAPI: http://localhost:PORT/help

lko
fonte
@ Iko eu fiz tudo o que você escreveu no código, mas eu erro quando o executo. dá-me um erro
ninjaXnado
1
Tente procurar a mensagem de erro. Essas etapas foram essencialmente o que era necessário no caso geral.
LKO
13
"A ordem das rotas Global.asax.cs é crítica" +1
Jim Aho
Não consegui entender como testar se adicionei a API da Web corretamente? O que exatamente devo escrever no navegador? Eu escrevi, http://localhost:12345/api/Get/5mas recebi um erro.
jason
3
Eu estava usando a "maneira antiga" chamando WebApiConfig.Register (GlobalConfiguration.configuration); e eu não podia mais depurar. Eu começaria a depurar e nunca alcançaria minhas funções de controlador. Mudei para o "novo caminho" GlobalConfiguration.Configure (WebApiConfig.Register); e o problema foi resolvido.
D. Kermott