Hospedar internamente o ASP.NET Web API 1 (c#)Self-Host ASP.NET Web API 1 (C#)

por Mike Wassonby Mike Wasson

API Web ASP.NET não requer o IIS.ASP.NET Web API does not require IIS. Você pode hospedar internamente uma API da web em seu próprio processo de host.You can self-host a web API in your own host process. Este tutorial mostra como hospedar uma API da web dentro de um aplicativo de console.This tutorial shows how to host a web API inside a console application.

Novos aplicativos devem usar o OWIN para auto-hospedar a API da Web.New applications should use OWIN to self-host Web API. Ver usar o OWIN para auto-hospedar a API Web ASP.NET 2.See Use OWIN to Self-Host ASP.NET Web API 2.

Versões de software usadas no tutorialSoftware versions used in the tutorial

  • API Web 1Web API 1
  • Visual Studio 2012Visual Studio 2012

Criar o projeto de aplicativo de ConsoleCreate the Console Application Project

Inicie o Visual Studio e selecione Novo projeto na página Iniciar.Start Visual Studio and select New Project from the Start page. Ou, no menu Arquivo, selecione Novo e, em seguida, Projeto.Or, from the File menu, select New and then Project.

No painel Modelos, selecione Modelos Instalados e expanda o nó Visual C#.In the Templates pane, select Installed Templates and expand the Visual C# node. Sob Visual c#, selecione Windows.Under Visual C#, select Windows. Na lista de modelos de projeto, selecione aplicativo de Console.In the list of project templates, select Console Application. Nomeie o projeto "SelfHost" e clique em Okey.Name the project "SelfHost" and click OK.

Defina a estrutura de destino (Visual Studio 2010)Set the Target Framework (Visual Studio 2010)

Se você estiver usando o Visual Studio 2010, altere a estrutura de destino para o .NET Framework 4.0.If you are using Visual Studio 2010, change the target framework to .NET Framework 4.0. (Por padrão, os destinos de modelo de projeto do perfil do .net Framework Client.)(By default, the project template targets the .Net Framework Client Profile.)

No Gerenciador de soluções, clique com botão direito no projeto e selecione propriedades.In Solution Explorer, right-click the project and select Properties. No estrutura de destino lista suspensa lista, altere a estrutura de destino para o .NET Framework 4.0.In the Target framework dropdown list, change the target framework to .NET Framework 4.0. Quando solicitado para aplicar a alteração, clique em Sim.When prompted to apply the change, click Yes.

Instalar o Gerenciador de pacotes NuGetInstall NuGet Package Manager

O Gerenciador de pacotes do NuGet é a maneira mais fácil para adicionar os assemblies de API da Web a um projeto não seja ASP.NET.The NuGet Package Manager is the easiest way to add the Web API assemblies to a non-ASP.NET project.

Para verificar se o Gerenciador de pacotes do NuGet está instalado, clique o ferramentas menu do Visual Studio.To check if NuGet Package Manager is installed, click the Tools menu in Visual Studio. Se você vir um item de menu chamado Library Package Manager, em seguida, você tem o Gerenciador de pacotes NuGet.If you see a menu item called Library Package Manager, then you have NuGet Package Manager.

Para instalar o Gerenciador de pacotes NuGet:To install NuGet Package Manager:

  1. Inicie o Visual Studio.Start Visual Studio.
  2. Dos ferramentas menu, selecione extensões e atualizações.From the Tools menu, select Extensions and Updates.
  3. No extensões e atualizações caixa de diálogo, selecione Online.In the Extensions and Updates dialog, select Online.
  4. Se você não vir "Gerenciador de pacotes do NuGet", digite "Gerenciador de pacotes do nuget" na caixa de pesquisa.If you don't see "NuGet Package Manager", type "nuget package manager" in the search box.
  5. Selecione o Gerenciador de pacotes do NuGet e clique em baixar.Select the NuGet Package Manager and click Download.
  6. Após a conclusão do download, você será solicitado a instalar.After the download completes, you will be prompted to install.
  7. Depois que a instalação for concluída, você talvez seja solicitado para reiniciar o Visual Studio.After the installation completes, you might be prompted to restart Visual Studio.

Adicione o pacote do NuGet da API WebAdd the Web API NuGet Package

Depois de instalar o Gerenciador de pacotes NuGet, adicione o pacote de Self de API da Web ao seu projeto.After NuGet Package Manager is installed, add the Web API Self-Host package to your project.

  1. Dos ferramentas menu, selecione Library Package Manager.From the Tools menu, select Library Package Manager. Observação: se você não vê esse menu item, certifique-se de que NuGet Package Manager instalada corretamente.Note: If do you not see this menu item, make sure that NuGet Package Manager installed correctly.
  2. Selecione gerenciar pacotes NuGet para solução...Select Manage NuGet Packages for Solution...
  3. No gerenciar pacotes NuGet caixa de diálogo, selecione Online.In the Manage NugGet Packages dialog, select Online.
  4. Na caixa de pesquisa, digite "Microsoft.AspNet.WebApi.SelfHost".In the search box, type "Microsoft.AspNet.WebApi.SelfHost".
  5. Selecione o pacote de Host de autoatendimento do ASP.NET Web API e clique em instalar.Select the ASP.NET Web API Self Host package and click Install.
  6. Depois de instala o pacote, clique em feche para fechar a caixa de diálogo.After the package installs, click Close to close the dialog.

Observação

Certifique-se de instalar o pacote denominado Microsoft.AspNet.WebApi.SelfHost, não AspNetWebApi.SelfHost.Make sure to install the package named Microsoft.AspNet.WebApi.SelfHost, not AspNetWebApi.SelfHost.

Criar o modelo e o controladorCreate the Model and Controller

Este tutorial usa as mesmas classes de modelo e controlador como o guia de Introdução tutorial.This tutorial uses the same model and controller classes as the Getting Started tutorial.

Adicione uma classe pública denominada Product.Add a public class named Product.

namespace SelfHost
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public decimal Price { get; set; }
    }
}

Adicione uma classe pública denominada ProductsController.Add a public class named ProductsController. Derive essa classe de ApiController.Derive this class from System.Web.Http.ApiController.

namespace SelfHost
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Web.Http;
    
    public class ProductsController : ApiController
    {
        Product[] products = new Product[]  
        {  
            new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },  
            new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },  
            new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }  
        };

        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }

        public Product GetProductById(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return product;
        }

        public IEnumerable<Product> GetProductsByCategory(string category)
        {
            return products.Where(p => string.Equals(p.Category, category,
                    StringComparison.OrdinalIgnoreCase));
        }
    }
}

Para obter mais informações sobre o código neste controlador, consulte o guia de Introdução tutorial.For more information about the code in this controller, see the Getting Started tutorial. Esse controlador define três ações GET:This controller defines three GET actions:

URIURI DescriçãoDescription
produtos/api //api/products Obtenha uma lista de todos os produtos.Get a list of all products.
/API/produtos/id/api/products/id Obter um produto por ID.Get a product by ID.
/api/products/?category=category/api/products/?category=category Obtenha uma lista de produtos por categoria.Get a list of products by category.

Hospedar a API da WebHost the Web API

Abra o arquivo Program.cs e adicione as seguintes instruções using:Open the file Program.cs and add the following using statements:

using System.Web.Http;
using System.Web.Http.SelfHost;

Adicione o seguinte código para o programa classe.Add the following code to the Program class.

var config = new HttpSelfHostConfiguration("http://localhost:8080");

config.Routes.MapHttpRoute(
    "API Default", "api/{controller}/{id}", 
    new { id = RouteParameter.Optional });

using (HttpSelfHostServer server = new HttpSelfHostServer(config))
{
    server.OpenAsync().Wait();
    Console.WriteLine("Press Enter to quit.");
    Console.ReadLine();
}

(Opcional) Adicionar uma reserva de Namespace de URL HTTP(Optional) Add an HTTP URL Namespace Reservation

Esse aplicativo atende a http://localhost:8080/.This application listens to http://localhost:8080/. Por padrão, escutando em um determinado endereço HTTP requer privilégios de administrador.By default, listening at a particular HTTP address requires administrator privileges. Quando você executar o tutorial, portanto, você pode obter esse erro: "HTTP não foi possível registrar a URL http://+:8080/" há duas maneiras de evitar esse erro:When you run the tutorial, therefore, you may get this error: "HTTP could not register URL http://+:8080/" There are two ways to avoid this error:

  • Executar o Visual Studio com permissões de administrador com privilégios elevados, ouRun Visual Studio with elevated administrator permissions, or
  • Use Netsh.exe para conceder as permissões de conta para reservar a URL.Use Netsh.exe to give your account permissions to reserve the URL.

Para usar Netsh.exe, abra um prompt de comando com privilégios de administrador e digite o seguinte comando: comando a seguir:To use Netsh.exe, open a command prompt with administrator privileges and enter the following command:following command:

netsh http add urlacl url=http://+:8080/ user=machine\username

em que máquina \ nomedeusuário é sua conta de usuário.where machine\username is your user account.

Quando tiver terminado de hospedagem interna, não se esqueça de excluir a reserva:When you are finished self-hosting, be sure to delete the reservation:

netsh http delete urlacl url=http://+:8080/

Chamar a API Web de um aplicativo cliente (c#)Call the Web API from a Client Application (C#)

Vamos escrever um aplicativo de console simples que chama a API da web.Let's write a simple console application that calls the web API.

Adicione um novo projeto de aplicativo de console à solução:Add a new console application project to the solution:

  • No Gerenciador de soluções, a solução com o botão direito e selecione adicionar novo projeto.In Solution Explorer, right-click the solution and select Add New Project.
  • Criar um novo aplicativo de console chamado "ClientApp".Create a new console application named "ClientApp".

Use o Gerenciador de pacotes de NuGet para adicionar o pacote de bibliotecas de núcleo do ASP.NET Web API:Use NuGet Package Manager to add the ASP.NET Web API Core Libraries package:

  • No menu Ferramentas, selecione Gerenciador de pacotes de biblioteca.From the Tools menu, select Library Package Manager.
  • Selecione gerenciar pacotes NuGet para solução...Select Manage NuGet Packages for Solution...
  • No gerenciar pacotes NuGet caixa de diálogo, selecione Online.In the Manage NuGet Packages dialog, select Online.
  • Na caixa de pesquisa, digite "Microsoft.AspNet.WebApi.Client".In the search box, type "Microsoft.AspNet.WebApi.Client".
  • Selecione o pacote de bibliotecas de cliente do Microsoft ASP.NET Web API e clique em instalar.Select the Microsoft ASP.NET Web API Client Libraries package and click Install.

Adicione uma referência no ClientApp ao projeto SelfHost:Add a reference in ClientApp to the SelfHost project:

  • No Gerenciador de soluções, clique com botão direito no projeto ClientApp.In Solution Explorer, right-click the ClientApp project.
  • Selecione Adicionar Referência.Select Add Reference.
  • No Gerenciador de referências caixa de diálogo, em solução, selecione projetos.In the Reference Manager dialog, under Solution, select Projects.
  • Selecione o projeto SelfHost.Select the SelfHost project.
  • Clique em OK.Click OK.

Abra o arquivo Client/Program.cs.Open the Client/Program.cs file. Adicione o seguinte usando instrução:Add the following using statement:

using System.Net.Http;

Adicionar um estático HttpClient instância:Add a static HttpClient instance:

namespace Client
{
    class Program
    {
        static HttpClient client = new HttpClient();
    }
}

Adicione os seguintes métodos para listar todos os produtos, um produto por ID de lista e listam os produtos por categoria.Add the following methods to list all products, list a product by ID, and list products by category.

static void ListAllProducts()
{
    HttpResponseMessage resp = client.GetAsync("api/products").Result;
    resp.EnsureSuccessStatusCode();

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var p in products)
    {
        Console.WriteLine("{0} {1} {2} ({3})", p.Id, p.Name, p.Price, p.Category);
    }
}

static void ListProduct(int id)
{
    var resp = client.GetAsync(string.Format("api/products/{0}", id)).Result;
    resp.EnsureSuccessStatusCode();

    var product = resp.Content.ReadAsAsync<SelfHost.Product>().Result;
    Console.WriteLine("ID {0}: {1}", id, product.Name);
}

static void ListProducts(string category)
{
    Console.WriteLine("Products in '{0}':", category);

    string query = string.Format("api/products?category={0}", category);

    var resp = client.GetAsync(query).Result;
    resp.EnsureSuccessStatusCode();

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var product in products)
    {
        Console.WriteLine(product.Name);
    }
}

Cada um desses métodos segue o mesmo padrão:Each of these methods follows the same pattern:

  1. Chame HttpClient.GetAsync para enviar uma solicitação GET para o URI apropriado.Call HttpClient.GetAsync to send a GET request to the appropriate URI.
  2. Chame HttpResponseMessage.EnsureSuccessStatusCode.Call HttpResponseMessage.EnsureSuccessStatusCode. Esse método gera uma exceção se o status da resposta HTTP é um código de erro.This method throws an exception if the HTTP response status is an error code.
  3. Chame ReadAsAsync<T> para desserializar um tipo CLR da resposta HTTP.Call ReadAsAsync<T> to deserialize a CLR type from the HTTP response. Esse método é um método de extensão definido no System.Net.Http.HttpContentExtensions.This method is an extension method, defined in System.Net.Http.HttpContentExtensions.

O GetAsync e ReadAsAsync métodos são assíncronas.The GetAsync and ReadAsAsync methods are both asynchronous. Elas retornam tarefa objetos que representam a operação assíncrona.They return Task objects that represent the asynchronous operation. Introdução a resultado propriedade bloqueará o thread até que a operação seja concluída.Getting the Result property blocks the thread until the operation completes.

Para obter mais informações sobre como usar o HttpClient, incluindo como fazer chamadas sem bloqueio, consulte chamar um Web API de um cliente .NET.For more information about using HttpClient, including how to make non-blocking calls, see Calling a Web API From a .NET Client.

Antes de chamar esses métodos, defina a propriedade BaseAddress na instância do HttpClient para "http://localhost:8080".Before calling these methods, set the BaseAddress property on the HttpClient instance to "http://localhost:8080". Por exemplo:For example:

static void Main(string[] args)
{
    client.BaseAddress = new Uri("http://localhost:8080");

    ListAllProducts();
    ListProduct(1);
    ListProducts("toys");

    Console.WriteLine("Press Enter to quit.");
    Console.ReadLine();
}

Essa saída a seguir.This should output the following. (Lembre-se de executar o aplicativo SelfHost primeiro.)(Remember to run the SelfHost application first.)

1 Tomato Soup 1.0 (Groceries)
2 Yo-yo 3.75 (Toys)
3 Hammer 16.99 (Hardware)
ID 1: Tomato Soup
Products in 'toys':
Yo-yo
Press Enter to quit.