Certificação Microsoft 70-487: Objetivo 4.4 – Host and manage a Web API

Olá pessoal!
O objetivo 4.4 da certificação Microsoft 70-487, Host and manage a Web API, trata dos principais mecanismos de hospedagem de um serviço Web API, como self-hosting, IIS e Azure. Também mostra como limitar o tamanho das mensagens recebidas e configurar a hospedagem para streaming. Vamos lá?

Web API Self-Hosting

Para fazer o self-hosting de uma Web API, você pode usar qualquer template de projeto que crie um executável, como Windows Service, Windows Forms Application, Console Application, etc.

Com o projeto criado, você deve instalar o framework de self-hosting via NuGet com o pacote Microsoft ASP.NET Web API Self Host e referenciar os assemblies System.Web.Http e System.Web.Http.SelfHost:

self host

Depois, há dois passos essenciais: instanciar as classes HttpSelfHostConfiguration e HttpSelfHostServer. O código fica assim:

A primeira verificação se MyWebApi.Controllers.ValuesController é null serve para o framework de self-hosting carregar os controllers do seu projeto Web API. Isso somente é necessário quando os controllers estão num assembly separado.

A classe HttpSelfHostConfiguration recebe o endereço base de onde o serviço vai ser acessado. Um ponto importante aqui é que as rotas precisam ser configuradas diretamente na propriedade Routes.

Por último, a classe HttpSelfHostServer é instanciada recebendo a configuração criada anteriormente. O método OpenAsync toma conta de abrir o servidor com as configurações passadas.

Web API IIS Hosting

Hospedar uma Web API no IIS não tem nada diferente de outras aplicações web.

Você pode primeiro criar uma application pool, conforme abaixo:

application pool

Depois, criar um novo website embaixo do nodo Sites ou adicionar uma aplicação ou diretório virtual:

add application

Com tudo isso no lugar, sua aplicação deve estar hospedada com sucesso.

Web API Windows Azure Hosting

Essa é uma seção conceitual para as 3 formas de hospedar uma Web API no Azure. São elas:

  • Windows Azure Websites: a opção mais rápida. Com Azure Websites você não se importa com a máquina que está hospedando seu serviço, apesar de poder escalar sua aplicação facilmente;
  • Windows Azure Cloud Services: Cloud Services oferecem um controle maior. Você tem mais tamanhos de instância para escolher e pode criar uma arquitetura mais complexa, como uma Web API numa Web Role se comunicando via queue com uma Worker Role, por exemplo. Você pode também configurar o IIS e outras configurações da máquina quando a role começar. Consegue também se conectar via remote com a máquina;
  • Windows Azure Virtual Machines (VMs): usar VMs no Azure te dá controle completo. Você precisa gerenciar sua máquina inteira, de atualizações até configurações.

Fazer o deploy de uma Web API para o Azure Websites ou Cloud Services é bem simples usando o Visual Studio. Isso será coberto com mais detalhes no capítulo 5.

Limitando O Tamanho Das Mensagens

Ao hospedar sua Web API, você com certeza gostaria de limitar o tamanho dos requests para que seu servidor não sofra de ataques DDoS.

Usando self-hosting, você pode fazer isso setando as propriedades MaxReceivedMessageSize e MaxBufferSize do objeto HttpSelfHostConfiguration:

var config = new HttpSelfHostConfiguration(baseAddress);
config.MaxReceivedMessageSize = 1024;
config.MaxBufferSize = 1024;

Hospedando no IIS, isso é possível pela configuração do atributo maxRequestLength no web.config:

<httpRuntime maxRequestLength="1024" />

Configurando Streaming

Às vezes você quer que seu serviço Web API receba arquivos grandes, como algum upload de imagens ou vídeos. Nesses casos, é importante configurar sua Web API para usar streaming ao invés de buffer, já que bufferizar arquivos grandes consome muita memória.

Hospedando sua aplicação no IIS, você consegue implementar sua lógica se usar buffer ou streaming herdando a classe WebHostBufferPolicySelector, a única que implementa a interface IHostBufferPolicySelector, e sobrescrevendo o método UseBufferedInputStream. Por exemplo, você pode habilitar streaming apenas para um controller específico:

Depois disso, você deve configurar o HttpConfiguration para usar sua implementação: config.Services.Replace(typeof(IHostBufferPolicySelector), new StreamingPolicySelector());.

Por último, você precisa configurar as propriedades do ASP.NET como maxAllowedContentLength e maxRequestLength no web.config para que o IIS não rejeite os requests grandes:

Para self-hosting, você só consegue habilitar streaming para todos os controllers. Você faz isso configurando a propriedade TransferMode no objeto HttpSelfHostConfiguration:

// somente requests
selfHostConf.TransferMode = TransferMode.StreamedRequest;
// somente responses
selfHostConf.TransferMode = TransferMode.StreamedResponse;
// ambos
selfHostConf.TransferMode = TransferMode.Streamed;


Isso é tudo para esse objetivo :)

Obrigado pela leitura e fique de olho no próximo post, que será o último objetivo sobre Web API: Consume Web API web services.

Até mais!