ASP.NET Web API 2.2의 새로운 기능

작성자: Microsoft

이 항목에서는 ASP.NET Web API 2.2의 새로운 사항에 대해 설명합니다.

다운로드

런타임 기능은 NuGet 갤러리에서 NuGet 패키지로 릴리스됩니다. 모든 런타임 패키지는 의미 체계 버전 관리 사양을 따릅니다. 최신 ASP.NET Web API 2.2 패키지의 버전은 "5.2.0"입니다. NuGet을 통해 이러한 패키지를 설치하거나 업데이트할 수 있습니다. 릴리스에는 NuGet의 해당 지역화된 패키지도 포함되어 있습니다.

NuGet 패키지 관리자 콘솔을 사용하여 릴리스된 NuGet 패키지를 설치하거나 업데이트할 수 있습니다.

Install-Package Microsoft.AspNet.WebApi -Version 5.2.0

설명서

ASP.NET Web API 2.2에 대한 자습서 및 기타 정보는 ASP.NET 웹 사이트(https://www.asp.net/web-api)에서 확인할 수 있습니다.

ASP.NET Web API 2.2의 새로운 기능

OData v4

이 릴리스는 OData v4 프로토콜에 대한 지원을 추가합니다. 자세한 내용은 Web API OData v4 설명서를 참조하세요.

다음은 OData v4의 몇 가지 주요 기능 및 변경 내용입니다.

특성 라우팅 개선 사항

특성 라우팅은 이제 특성 경로를 검색하고 구성하는 방법을 완전히 제어할 수 있는 IDirectRouteProvider라는 확장성 지점을 제공합니다. IDirectRouteProvider는 관련 경로 정보와 함께 작업 및 컨트롤러 목록을 제공하여 해당 작업에 필요한 라우팅 구성을 정확히 지정합니다. MapAttributes/MapHttpAttributeRoutes를 호출할 때 IDirectRouteProvider 구현을 지정할 수 있습니다.

기본 구현인 DefaultDirectRouteProvider를 확장하여 IDirectRouteProvider를 사용자 지정하는 것이 가장 쉽습니다. 이 클래스는 특성을 검색하고, 경로 항목을 만들고, 경로 접두사 및 영역 접두사를 검색하기 위한 논리를 변경하는 별도의 재정의 가능한 가상 메서드를 제공합니다.

다음은 이 새로운 확장성 지점으로 수행할 수 있는 몇 가지 예입니다.

  1. 경로 특성 상속 지원

    예제:

    여기서 "/api/values/10"와 같은 요청은 "Success: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. 원하는 몇 가지 규칙에 따라 특성 경로에 대한 기본 경로 이름을 제공합니다. 기본적으로 특성 라우팅은 특성 경로에 대한 이름을 자동으로 만들지 않습니다.

  3. 특성 경로의 경로 템플릿이 경로 테이블에 저장되기 전에 중앙의 한 위치에서 수정합니다.

Windows Phone 8.1에 대한 Web API 클라이언트 지원

이제 Web API 클라이언트 NuGet 패키지를 사용하여 유니버설 앱 내에서 Windows Phone 8.1을 대상으로 지정할 때 Web API 클라이언트 논리를 구현할 수 있습니다.

알려진 문제 및 호환성이 손상되는 변경

이 섹션에서는 ASP.NET Web API 2.2의 알려진 문제 및 호환성이 손상되는 변경에 대해 설명합니다.

OData v4

모델 작성기

문제: 오버로드된 함수를 FunctionImport로 노출할 수 없습니다.

오버로드된 함수가 2개이고 아래와 같이 FunctionImport인 경우 ~/GetAllConventionCustomers(CustomerName={customerName})를 요청하면 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" />

해결 방법: 이 문제의 해결 방법은 함수 오버로드를 모두 FunctionImports로 추가하는 것입니다.

OData 라우팅

URL로 인코딩된 슬래시(%2F) 및 백슬래시(%5C)를 포함하는 문자열 리터럴은 OData 리소스 경로에서 사용될 때 404 오류를 발생합니다.

예를 들어 OData 리소스 경로에서 문자열 리터럴을 함수의 매개 변수 또는 엔터티 집합의 키 값으로 사용할 수 있습니다.

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

/Employees('Name%5C')

서비스가 이러한 요청을 받으면 호스트는 Web API 런타임에 전달하기 전에 이러한 이스케이프 시퀀스를 이스케이프 해제합니다. 이렇게 하면 다음과 같은 공격으로부터 보호됩니다.

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

이로 인해 Web API OData 스택이 404 오류(찾을 수 없음)를 반환합니다. 이 오류를 방지하려면 클라이언트가 슬래시(%252F) 및 백슬래시(%255C)에 이중 이스케이프 시퀀스를 사용해야 합니다. /Employees?$filter=Name eq 'Name%2F'와 같은 쿼리 문자열에는 이 문제가 발생하지 않습니다.

OData 리소스 경로 문자열 리터럴에서는 이스케이프되지 않은 슬래시('/') 및 백슬라이시('')가 적합하지 않습니다. 슬래시는 경로 구분 기호로만 나타나야 하며 백슬라이시는 OData 리소스 경로에 전혀 표시되지 않아야 합니다. (둘 다 OData 쿼리 문자열의 일부분에서 사용할 수 있습니다.)

해결 방법: DefaultODataPathHandler의 Parse 메서드를 재정의하여 문자열 리터럴에서 슬래시 및 백슬래시를 이스케이프한 후 실제로 구문 분석할 수 있습니다. 이 방법의 샘플은 여기에서 찾을 수 있습니다.

OData v3

[쿼리 가능]

[Queryable] 특성은 더 이상 사용되지 않습니다. 새 OData v3 애플리케이션은 System.Web.Http.OData.EnableQueryAttribute를 사용해야 합니다.

ODataHttpConfigurationExtensions.EnableQuerySupport 확장 메서드는 이제 EnableQueryAttribute를 전역 필터 컬렉션에 추가합니다. 컨트롤러에 [Queryable] 특성이 있는 경우 를 호출 config.EnableQuerySupport() 하면 [Queryable] 특성이 실패합니다.

이 문제를 resolve 권장되는 방법은 QueryableAttribute의 모든 인스턴스를 System.Web.Http.OData.EnableQueryAttribute로 바꾸는 것입니다.

다른 해결 방법은 Web API 구성에서 다음 코드를 사용하는 것입니다.

config.EnableQuerySupport(new QueryableAttribute());

특성 라우팅

문제: FromUri 특성으로 데코레이팅되는 복합 형식의 모델 바인딩은 특성 라우팅을 사용할 때 다르게 동작합니다.

문제: MVC/Web API를 5.2.0 패키지가 있는 프로젝트로 스캐폴딩하면 프로젝트에 아직 없는 패키지에 대해 5.1.2 패키지가 생성됩니다.

ASP.NET MVC 5.2용 NuGet 패키지를 업데이트해도 ASP.NET 스캐폴딩 또는 ASP.NET 웹 애플리케이션 프로젝트 템플릿과 같은 Visual Studio 도구는 업데이트되지 않습니다. 이전 버전의 ASP.NET 런타임 패키지(예: 업데이트 2의 5.1.2)를 사용합니다. 따라서 ASP.NET 스캐폴딩은 프로젝트에서 아직 사용할 수 없는 경우 필요한 패키지의 이전 버전(예: 업데이트 2의 5.1.2)을 설치합니다. 그러나 Visual Studio 2013 RTM 또는 업데이트 1의 ASP.NET 스캐폴딩은 프로젝트의 최신 패키지를 덮어쓰지 않습니다. 프로젝트의 패키지를 Web API 2.2 또는 ASP.NET MVC 5.2로 업데이트한 후 ASP.NET 스캐폴딩을 사용하는 경우 Web API 및 ASP.NET MVC의 버전이 일관된지 확인합니다.

Microsoft.AspNet.OData 5.2.1

Microsoft.AspNet.OData 5.2.1 패키지에는 NuGet 종속성 업데이트가 포함되어 있지만 버그 수정은 없습니다. 이 업데이트를 사용하면 Microsoft.OData.Core 6.4.0에 대한 엄격한 종속성이 더 이상 없지만 6.4.0에서 7.0.0 사이의 버전으로 업그레이드할 수 있습니다.

Microsoft.AspNet.WebAPI 5.2.2

이 릴리스에서는 에 대한 종속성을 변경했습니다 Json.Net 6.0.4. 이 릴리스의 Json.NET새로운 내용에 대한 자세한 내용은 Json.NET 6.0 릴리스 4 - JSON 병합, 종속성 주입을 참조하세요. 이 릴리스에는 Web API의 다른 새로운 기능이나 버그 수정이 없습니다. 이후에 이 새 버전의 Web API에 종속되도록 소유한 다른 모든 종속 패키지를 업데이트했습니다.

Microsoft.AspNet.WebAPI 5.2.3 베타

릴리스에 대한 내용은 여기에서 확인할 수 있습니다. 이 릴리스에는 버그 수정만 포함되어 있습니다.