Novidades no ASP.NET Web API 2.2

pela Microsoft

Este tópico descreve as novidades do ASP.NET Web API 2.2.

Baixar

Os recursos de runtime são lançados como pacotes NuGet na galeria do NuGet. Todos os pacotes de runtime seguem a especificação de Controle de Versão Semântico . O pacote mais recente do ASP.NET Web API 2.2 tem a seguinte versão: "5.2.0". Você pode instalar ou atualizar esses pacotes por meio do NuGet. A versão também inclui pacotes localizados correspondentes no NuGet.

Você pode instalar ou atualizar para os pacotes NuGet lançados usando o Console do Gerenciador de Pacotes NuGet:

Install-Package Microsoft.AspNet.WebApi -Version 5.2.0

Documentação

Tutoriais e outras informações sobre ASP.NET Web API 2.2 estão disponíveis no site do ASP.NET (https://www.asp.net/web-api).

Novos recursos no ASP.NET Web API 2.2

OData v4

Esta versão adiciona suporte para o protocolo OData v4. Para obter mais informações, consulte a documentação da API Web OData v4.

Aqui estão alguns dos principais recursos e alterações para o OData v4:

Melhorias de roteamento de atributo

O Roteamento de Atributos agora fornece um ponto de extensibilidade chamado IDirectRouteProvider, que permite controle total sobre como as rotas de atributo são descobertas e configuradas. Um IDirectRouteProvider é responsável por fornecer uma lista de ações e controladores juntamente com informações de rota associadas para especificar exatamente qual configuração de roteamento é desejada para essas ações. Uma implementação IDirectRouteProvider pode ser especificada ao chamar MapAttributes/MapHttpAttributeRoutes.

Personalizar IDirectRouteProvider será mais fácil estendendo nossa implementação padrão, DefaultDirectRouteProvider. Essa classe fornece métodos virtuais substituíveis separados para alterar a lógica para descobrir atributos, criar entradas de rota e descobrir prefixo de rota e prefixo de área.

A seguir estão alguns exemplos sobre o que você poderia fazer com este novo ponto de extensibilidade:

  1. Herança de suporte de atributos de rota

    Exemplo:

    Aqui, uma solicitação como "/api/values/10" retornaria com êxito "Êxito:10"

    public class BaseController : ApiController
    {
        [Route("{id:int}")]
        public string Get(int id)
        {
            return "Success:" + id;
        }
    }
    [RoutePrefix("api/values")]
    public class ValuesController : BaseController
    {
    }
           
    config.MapHttpAttributeRoutes(new CustomDirectRouteProvider());
    public class CustomDirectRouteProvider : DefaultDirectRouteProvider
    {
        protected override IReadOnlyList<IDirectRouteFactory> 
        GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
        {
            return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>
            (inherit: true);
        }
    }
    
  2. Forneça um nome de rota padrão para suas rotas de atributo seguindo algumas convenções que você deseja. Por padrão, o roteamento de atributo não cria nomes automaticamente para rotas de atributo.

  3. Modifique o modelo de rota das rotas de atributo em um local central antes que elas acabem na tabela de rotas.

Suporte ao cliente da API Web para Windows Phone 8.1

Agora você pode usar o pacote NuGet do Cliente de API Web para implementar sua lógica de cliente da API Web ao direcionar Windows Phone 8.1 ou de dentro de um Aplicativo Universal.

Problemas conhecidos e alterações interruptivas

Esta seção descreve problemas conhecidos e alterações interruptivas no ASP.NET Web API 2.2.

OData v4

Construtor de modelos

Problema: Funções sobrecarregadas não puderam ser expostas como FunctionImport

Se houver duas funções sobrecarregadas e elas também forem FunctionImport, conforme mostrado abaixo, solicitar ~/GetAllConventionCustomers(CustomerName={customerName}) resultará em System.InvalidOperationException.

<Function Name="GetAllConventionCustomers" 
ReturnType="Collection(WebStack.QA.Test.OData.UnboundOperation.ConventionCustomer)" 
IsComposable="true" />
<Function Name="GetAllConventionCustomers" 
ReturnType="Collection(WebStack.QA.Test.OData.UnboundOperation.ConventionCustomer)" 
IsComposable="true">
<Parameter Name="CustomerName" Type="Edm.String" FixedLength="false" 
Unicode="false" />
</Function>
...
<FunctionImport Name="GetAllConventionCustomers" 
Function="WebStack.QA.Test.OData.UnboundOperation.GetAllConventionCustomers" 
EntitySet="ConventionCustomers" IncludeInServiceDocument="true" />

Solução alternativa: a solução alternativa para esse problema é adicionar as sobrecargas de função como FunctionImports.

Roteamento OData

Literais de cadeia de caracteres que incluem a barra codificada em URL (%2F) e a barra invertida (%5C) causam um erro 404 quando são usados nos caminhos de recurso OData.

Por exemplo, literais de cadeia de caracteres podem ser usados nos caminhos de recurso OData como parâmetros de funções ou valores de chave de conjuntos de entidades.

/Employees/Total.GetCount(Name='Name%2F')

/Employees('Name%5C')

Quando os serviços recebem essas solicitações, os hosts cancelam o escape dessas sequências antes de passá-las para o runtime da API Web. Isso protege contra ataques como o seguinte:

http://www.contoso.com/..%2F..%2F/Windows/System32/cmd.exe?/c+dir+c:

Isso faz com que a pilha OData da API Web retorne um erro 404 (Não Encontrado). Para evitar esse erro, seu cliente deve usar as sequências de escape duplo para barra (%252F) e barra invertida (%255C). Isso não acontece para cadeias de caracteres de consulta como /Employees?$filter=Name eq 'Name%2F'

Observe que barras não escapadas ('/') e barras invertidas ('') não são legais em literais de cadeia de caracteres do caminho do recurso OData. As barras devem aparecer apenas como separadores de caminho e barras invertidas não devem aparecer no caminho do recurso OData. (Ambos são utilizáveis em algumas partes de uma cadeia de caracteres de consulta OData.)

Solução alternativa: você pode substituir o método Parse de DefaultODataPathHandler para escapar da barra e barra invertida em literais de cadeia de caracteres antes de realmente analisá-los. Você pode encontrar um exemplo dessa abordagem aqui.

OData v3

[Queryable]

O atributo [Queryable] foi preterido. Novos aplicativos OData v3 devem usar System.Web.Http.OData.EnableQueryAttribute.

O método de extensão ODataHttpConfigurationExtensions.EnableQuerySupport agora adiciona um EnableQueryAttribute à coleção de filtros global. Se algum controlador tiver o atributo [Queryable] , chamar config.EnableQuerySupport() fará com que o atributo [Queryable] falhe

A maneira recomendada de resolve esse problema é substituir todas as instâncias de QueryableAttribute por System.Web.Http.OData.EnableQueryAttribute.

Uma solução alternativa é usar o seguinte código na configuração da API Web:

config.EnableQuerySupport(new QueryableAttribute());

Roteamento de atributo

Problema: a associação de modelo de tipo complexo decorado com o atributo FromUri se comporta de forma diferente ao usar o Roteamento de Atributos.

Problema: o scaffolding MVC/API Web em um projeto com pacotes 5.2.0 resulta em pacotes 5.1.2 para os que ainda não existem no projeto

A atualização de pacotes NuGet para ASP.NET MVC 5.2 não atualiza as ferramentas do Visual Studio, como ASP.NET scaffolding ou o modelo de projeto ASP.NET Aplicativo Web. Eles usam a versão anterior do ASP.NET pacotes de runtime (por exemplo, 5.1.2 na Atualização 2). Como resultado, o ASP.NET scaffolding instalará a versão anterior (por exemplo, 5.1.2 na Atualização 2) dos pacotes necessários, se eles ainda não estiverem disponíveis em seus projetos. No entanto, o scaffolding ASP.NET em Visual Studio 2013 RTM ou Atualização 1 não substitui os pacotes mais recentes em seus projetos. Se você usar ASP.NET scaffolding depois de atualizar os pacotes de seus projetos para a API Web 2.2 ou ASP.NET MVC 5.2, verifique se as versões da API Web e ASP.NET MVC são consistentes.

Microsoft.AspNet.OData 5.2.1

O pacote Microsoft.AspNet.OData 5.2.1 contém atualizações de dependência do NuGet, mas nenhuma correção de bug. Com essa atualização, não há mais uma dependência estrita no Microsoft.OData.Core 6.4.0, mas é possível atualizar para qualquer versão entre 6.4.0 e 7.0.0.

Microsoft.AspNet.WebAPI 5.2.2

Nesta versão, fizemos uma alteração de dependência para Json.Net 6.0.4. Para obter mais informações sobre as novidades nesta versão do , consulte Json.NET versão 6.0 4 – Mesclagem JSON, Injeção deJson.NET Dependência. Esta versão não tem outros novos recursos ou correções de bugs na API Web. Posteriormente, atualizamos todos os outros pacotes dependentes que temos para depender dessa nova versão da API Web.

Microsoft.AspNet.WebAPI 5.2.3 Beta

Você pode ler sobre a versão aqui. Esta versão contém apenas correções de bugs.