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

365

Desejo adicionar uma API da Web do ASP.NET a um projeto de aplicativo da Web do ASP.NET MVC 4, desenvolvido no Visual Studio 2012. Quais etapas devo executar para adicionar uma API da Web em funcionamento ao projeto? Estou ciente de que preciso de um controlador derivado do ApiController, mas isso é tudo o que sei.

Informe-me se precisar fornecer mais detalhes.

aknuds1
fonte

Respostas:

455

As etapas que eu precisava executar foram:

  1. Adicione referência a System.Web.Http.WebHost.
  2. Adicione App_Start\WebApiConfig.cs(veja o trecho de código abaixo).
  3. Importar espaço System.Web.Httppara nome em Global.asax.cs.
  4. Chamada WebApiConfig.Register(GlobalConfiguration.Configuration)em MvcApplication.Application_Start()(em arquivo Global.asax.cs), antes de registrar a rota Aplicação Web padrão como que de outra forma têm precedência.
  5. Adicione um controlador derivado de System.Web.Http.ApiController.

Eu poderia aprender o suficiente com o tutorial (Sua primeira API da Web do ASP.NET) para definir meu controlador de API.

App_Start \ WebApiConfig.cs:

using System.Web.Http;

class WebApiConfig
{
    public static void Register(HttpConfiguration configuration)
    {
        configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });
    }
}

Global.asax.cs:

using System.Web.Http;

...

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    WebApiConfig.Register(GlobalConfiguration.Configuration);
    RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

Atualização 10.16.2015:

Como diz o Word, o pacote NuGet Microsoft.AspNet.WebApi deve estar instalado para que o procedimento acima funcione.

aknuds1
fonte
12
Isso foi realmente útil. Eu tive que adicionar uma referência System.Net.Httptambém, mas, além disso, funcionou como um encanto!
Christofer Eliasson
5
Também atualizei um projeto do MVC3 para 4 e também precisava adicionar uma referência ao System.Web.Http.
11138 Damien Sawyer
3
Agora você pode usar o nuget e ficar por dentro de todas as alterações que acontecerem! nuget.org/packages/Microsoft.AspNet.WebApi #
Chris
3
Não funcionaria até que eu alterasse meu registro de API da Web para: GlobalConfiguration.Configure (WebApiConfig.Register);
KingOfHypocrites
3
@LuisGouveia Eu acho que é tarde demais, mas alguém provavelmente resolverá mais rapidamente se é isso que eu tinha. GlobalConfiguration.Configure (WebApiConfig.Register); em Global.asax vai antes de RouteConfig.RegisterRoutes (RouteTable.Routes);
Maxim
77

ATUALIZAÇÃO 22/11/2013 - este é o pacote WebApi mais recente:

Install-Package Microsoft.AspNet.WebApi

Resposta original (este é um pacote WebApi mais antigo)

Install-Package AspNetWebApi

Mais detalhes .

cdeutsch
fonte
3
A partir de 2013, esse é um pacote herdado e você deseja Install-Package Microsoft.AspNet.WebApiagora. Veja nuget.org/packages/Microsoft.AspNet.WebApi
Chris
70

Para adicionar WebAPI no meu projeto MVC 5.

  1. Abra o console do gerenciador de pacotes do NuGet e execute

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Adicionar referências a System.Web.Routing, System.Web.Nete System.Net.HttpDLLs se não já

  3. Clique com o botão direito na pasta controladores> adicionar novo item> web> Adicionar controlador de API da Web

  4. Web.config será modificado de acordo com o VS

  5. Adicione Application_Startmétodo, se ainda não existir

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  6. Adicione a seguinte classe (eu adicionei no arquivo global.asax.cs)

    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 }
             );
         }
     }
  7. Modifique o método da API da Web de acordo

    namespace <Your.NameSpace.Here>
    {
        public class VSController : ApiController
        {
            // GET api/<controller>   : url to use => api/vs
            public string Get()
            {
                return "Hi from web api controller";
            }
    
            // GET api/<controller>/5   : url to use => api/vs/5
            public string Get(int id)
            {
                return (id + 1).ToString();
            }
        }
    }
  8. Reconstruir e testar

  9. Crie uma página html simples

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>    
        <script src="../<path_to_jquery>/jquery-1.9.1.min.js"></script>
        <script type="text/javascript">
            var uri = '/api/vs';
            $(document).ready(function () {
                $.getJSON(uri)
                .done(function (data) {
                    alert('got: ' + data);
                });
    
                $.ajax({
                    url: '/api/vs/5',
                    async: true,
                    success: function (data) {
                        alert('seccess1');
                        var res = parseInt(data);
                        alert('got res=' + res);
                    }
                });
            });
        </script>
    </head>
    <body>
    ....
    </body>
    </html>
kheya
fonte
O ponto que criou uma diferença estava colocando o WebApiconfig.Register na primeira linha, como foi mencionado por @kheya
Rajat
Gostaria de acrescentar que o nome do seu controlador de API precisa terminar com o Controller , como CarController (não apenas Car ) !!! Muitas pessoas esquecem e obtêm a mensagem de erro "Não foi encontrado nenhum tipo que corresponda ao controlador chamado {0} '"
1_bug 24/08/18
Para ser mais eficiente com esta resposta agradável, você pode desconsiderar as etapas 4, 8 e 9. (elas não são tão essenciais) E se você trocar a ordem das etapas 5 e 6, elas farão mais sentido (é melhor criar uma classe do que usá-lo, em vez de usar a classe, em seguida, criá-lo)
Hakan Fistik
Onde exatamente estamos adicionando referências a System.Web.Routing, System.Web.Net e System.Net.Http?
precisa saber é o seguinte
28

Assim que você adiciona um "WebApi Controller" na pasta controllers, o Visual Studio cuida das dependências automaticamente;

O Visual Studio adicionou o conjunto completo de dependências da ASP.NET Web API 2 ao projeto 'MyTestProject'.

O arquivo Global.asax.cs no projeto pode exigir alterações adicionais para habilitar a API da Web do ASP.NET.

  1. Adicione as seguintes referências de namespace:

    using System.Web.Http; using System.Web.Routing;

  2. Se o código ainda não definir um método Application_Start, adicione o seguinte método:

    void protegido Application_Start () {}

  3. Adicione as seguintes linhas ao início do método Application_Start:

    GlobalConfiguration.Configure (WebApiConfig.Register);

Teoman shipahi
fonte
Essa é de longe a maneira mais fácil de conseguir isso agora.
Adam Smith
11
Não funciona aqui. 1. Nuget: Install-Package Microsoft.AspNet.WebApi2. Adicione um novo item "Web API Controller Class (v2.1)". Resultado: adiciona o controlador da API, mas não muda Application_Start. Com Owin.
Artyom
2
esta é a resposta certa quando você tem o vs2015 - atualização 3 e adiciona o web api 2 controller.
ModChowdhury
Foi o que aconteceu em 2017, mas tive que atualizar meus assemblies WebApi. Eu também tive que criar a classe WebApiConfig manualmente, docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/...
johnny
22

Você pode instalar a partir do nuget como na imagem abaixo:

insira a descrição da imagem aqui

Ou, execute a linha de comando abaixo no Package Manager Console:

Install-Package Microsoft.AspNet.WebApi
cuongle
fonte
3
Então, o que mais eu preciso fazer, exceto adicionar o controlador? É por isso que eu postei esta pergunta em primeiro lugar, o tutorial não diz realmente porque assume um projeto de API da Web. Adicionei um controlador de API, mas ele não é roteado para.
precisa saber é o seguinte
11
O tutorial não foi de grande ajuda no que diz respeito à adição de uma API da Web a um projeto existente, então descobri isso a partir de um projeto de API da Web, conforme descrito na minha resposta.
precisa saber é o seguinte
Concordo, parece que esse encanamento já está instalado se você usar o modelo de projeto do Web App.
Longda
@ cuongle: a versão 2.2 da API da Web será instalada com o mvc 4? suporta MVC 4?
Thomas
20

Antes de começar a mesclar projetos MVC e API da Web, sugiro ler sobre contras e prós para separá-los como projetos diferentes. Uma coisa muito importante (minha) são os sistemas de autenticação, que são totalmente diferentes.

Se você precisar usar solicitações autenticadas no MVC e na API da Web, lembre-se de que a API da Web é RESTful (não precisa manter a sessão, solicitações HTTP simples etc.), mas o MVC não.

Para observar as diferenças de implementações, basta criar 2 projetos diferentes no Visual Studio 2013 a partir de Modelos: um para MVC e outro para API da Web (não se esqueça de ativar a "Autenticação individual" durante a criação). Você verá muita diferença nos AuthencationControllers.

Então, esteja ciente.

Yarkov Anton
fonte
11

NOTA: esta é apenas uma abreviação desta resposta acima

  1. Abra o console do gerenciador de pacotes do NuGet e execute

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Adicionar referências a System.Web.Routing, System.Web.Nete System.Net.HttpDLLs se não já

  3. Adicione a seguinte classe

    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 }
             );
         }
     }
  4. Adicione Application_Startmétodo, se ainda não existir (no arquivo global.asax.cs)

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  5. Clique com o botão direito na pasta controladores> adicionar novo item> web> Adicionar controlador de API da Web

    namespace <Your.NameSpace.Here>
    {
        public class VSController : ApiController
        {
            // GET api/<controller>   : url to use => api/vs
            public string Get()
            {
                return "Hi from web api controller";
            }  
        }
    }
Hakan Fıstık
fonte
Onde exatamente estamos adicionando referências a System.Web.Routing, System.Web.Net e System.Net.Http?
precisa saber é o seguinte
11
No diálogo Adicionar referência, abra esse diálogo e procure os nomes desses assemblies, há uma grande chance de eles já terem sido adicionados. (mas apenas para se certificar)
Hakan Fistik
O método Application_Start deveria fazer parte da classe global em Global.asax.cs?
precisa saber é o seguinte
sim, eu atualizei a minha resposta para demonstrar que, que para a nota
Hakan Fistik
11
@HakamFostok Isso me ajudou. Obrigado!
csichar
3

A solução acima funciona perfeitamente. Prefiro escolher a opção API da Web ao selecionar o modelo do projeto, como mostra a figura abaixo

Nota: A solução funciona com o Visual Studio 2013 ou superior. A pergunta original foi feita em 2012 e é 2016, portanto, adicionando uma solução Visual Studio 2013 ou superior.

Modelo de projeto mostrando a opção da API da web

Sankar Krishnamoorthy
fonte
2
Se você estiver criando um projeto que envolve a API da Web, seria mais fácil escolher a opção API da Web. A opção criará todos os arquivos necessários, conforme mencionado nas respostas acima.
Sankar Krishnamoorthy 25/04
O problema em questão aqui é no Visual Studio 2012 e MVC 4. Apesar de sua solução é muito bem, você não pode fazê-lo dessa forma no VS 2012
netfed
Este é um bom ponto e tentei a solução acima com o VS 2013. Obrigado @netfed por apontar.
Sankar Krishnamoorthy
Olá pessoal, Tenho o elemento API funcionando na minha solução MVC, mas como padrão, ele tentou executar a solução como uma solução API. Mas eu quero que ele seja executado como uma solução MVC como padrão e, se você for para o local da API, etc., execute as APIs. Alguém mais teve esse problema e conseguiu resolvê-lo? Obrigado
Chris Cooper
1

Eu tive o mesmo problema, a solução foi tão fácil

Clique com o botão direito do mouse em solotion e instale o Microsoft.ASP.NET.WebApi em "Gerenciar pacote Nuget para Sulotion"

boom é isso;)

iDeveloper
fonte