Próprio Host ASP.NET Web API 1 (c#)Self-Host ASP.NET Web API 1 (C#)

por Mike Wassonby Mike Wasson

API da Web do ASP.NET não requer o IIS.ASP.NET Web API does not require IIS. Automaticamente, você pode hospedar 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 OWIN para hospedagem interna de API da Web.New applications should use OWIN to self-host Web API. Consulte usar OWIN para hospedar o ASP.NET Web API 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 do iniciar página.Start Visual Studio and select New Project from the Start page. Ou, do arquivo menu, selecione novo e projeto.Or, from the File menu, select New and then Project.

No modelos painel, selecione modelos instalados e expanda o Visual C# nó.In the Templates pane, select Installed Templates and expand the Visual C# node. Em 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.

Definir 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 de perfil do .net Framework Client.)(By default, the project template targets the .Net Framework Client Profile.)

No Gerenciador de soluções, clique com o botão direito e selecione propriedades.In Solution Explorer, right-click the project and select Properties. No framework de destino 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 NuGet Package ManagerInstall NuGet Package Manager

O NuGet Package Manager é a maneira mais fácil para adicionar os assemblies de API da Web a um projeto de não-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 NuGet Package Manager 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 Gerenciador de biblioteca de pacote, em seguida, você tem o NuGet Package Manager.If you see a menu item called Library Package Manager, then you have NuGet Package Manager.

Para instalar o NuGet Package Manager:To install NuGet Package Manager:

  1. Inicie o Visual Studio.Start Visual Studio.
  2. Do 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 "NuGet Package Manager", digite "nuget package manager" na caixa de pesquisa.If you don't see "NuGet Package Manager", type "nuget package manager" in the search box.
  5. Selecione o NuGet Package Manager 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. Após a conclusão da instalação, você pode solicitado a reiniciar o Visual Studio.After the installation completes, you might be prompted to restart Visual Studio.

Adicionar o pacote de NuGet de API da WebAdd the Web API NuGet Package

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

  1. Do ferramentas menu, selecione Gerenciador de pacotes de biblioteca.From the Tools menu, select Library Package Manager. Observação: se você não vir esse menu item, certifique-se de que NuGet Package Manager está instalado 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 preciosidade pacotes 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 ASP.NET Web API Self Host e clique em instalar.Select the ASP.NET Web API Self Host package and click Install.
  6. Depois de instala o pacote, clique em fechar 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 o controlador como o Introdução tutorial.This tutorial uses the same model and controller classes as the Getting Started tutorial.

Adicionar uma classe pública chamada 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; }
    }
}

Adicionar uma classe pública chamada ProductsController.Add a public class named ProductsController. Derive essa classe de System.Web.Http.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 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 Obter uma lista de todos os produtos.Get a list of all products.
/api/products/id/api/products/id Obter um produto por ID.Get a product by ID.
/api/products/?category=category/api/products/?category=category Obter 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 o seguinte usando instruções: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 de HTTP(Optional) Add an HTTP URL Namespace Reservation

Este aplicativo ouve 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 pôde 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:

  • Execute 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

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

Quando você terminar de hospedagem interna, certifique-se de excluir a reserva:When you are finished self-hosting, be sure to delete the reservation:

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

Chame a API da 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 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 pacote de NuGet para adicionar o pacote ASP.NET Web API Core Libraries: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 em 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 lista 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. Chamar 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. Call HttpResponseMessage.EnsureSuccessStatusCode.Call HttpResponseMessage.EnsureSuccessStatusCode. Este método lança uma exceção se o status de resposta HTTP for um código de erro.This method throws an exception if the HTTP response status is an error code.
  3. Chamar 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 em 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. Obtendo o resultados propriedade bloqueia 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 HttpClient, inclusive como fazer chamadas sem bloqueio, consulte chamar uma 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();
}

Esta 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.