2017-12-19 2 views
1

벤더 애플리케이션에 의해 미리 정의 된 REST API를 구현하는 프로젝트를 빌드해야합니다. (이는 소비 할 것입니다.) - 다른 HTTP- 동사 (POST, GET, PUT, DELETE 등). ASP.Net Core WebApi의 비 속성 라우트

그래서, 이상적으로, 각 자원에 대해이 같은 하나의 클래스가 있어야합니다 이전 버전의

public class SomethingController 
{ 
    public Something Post(string name, DateTime time) 
    { 
    // ... 
    } 

    public int PostStrange(string text) 
    { 
    // ... 
    } 

    public Something Put([FromBody]Something item) 
    { 
    // ... 
    } 

    public void Delete(int id) 
    { 
    // ... 
    } 
} 

난 그냥 경로를 등록하는 동안, MapHttpRoute 전화 ApiController에서이 같은 클래스를 상속 할 수 있습니다 - 그리고 ASP.NET 웹 API가 내가 필요로 할 것입니다 ...하지만 .NET 코어에서 MapHttpRoute/ApiController 같은 것을 찾을 수 없습니다 .. 이제 거기에 라우팅 및 HTTP 동사 특성 및 모든 클래스/메서드에 대해 명시 적으로 모든 정의해야합니다 :

[Route("api/[controller]")] 
public class SomethingController : Controller 
{ 
    [HttpPost] 
    public Something Post(string name, DateTime time) 
    { 
     // ... 
    } 

    [HttpPost("api/[controller]/strange")] 
    public int PostStrange(string text) 
    { 
     // ... 
    } 

    [HttpPut] 
    public Something Put([FromBody]Something item) 
    { 
     // ... 
    } 

    [HttpDelete] 
    public void Delete(int id) 
    { 
     // ... 
    } 
} 

글쓰기 thi 수천 개의 REST- 리소스 각각에 대한 속성은 매우 지루하고 오류가 발생하기 쉽습니다 ...

여기에 뭔가가 있습니까? 왜 꽤 새롭고 현대적인 ASP.NET 코어에서 REST-Api를 구축 할 때 매우 일반적이며 중요한 것은 이전 ASP.NET과 비교하여 너무 복잡해 졌습니까?

답변

2

웹 API에서 코어로의 마이그레이션을 더 쉽게하는 것이 주요 목표 인 Nuget 패키지 Microsoft.AspNetCore.Mvc.WebApiCompatShim이 있습니다. 또한 필요한 작업에 대한 컨벤션 기반 라우팅을 수행하는 방법을 제공합니다. 그래서, 먼저 시작으로, 해당 패키지를 설치

public void ConfigureServices(IServiceCollection services) { 
    // add conventions here 
    services.AddMvc().AddWebApiConventions();     
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env) { 
    app.UseMvc(routes => { 
     // map one global route 
     routes.MapWebApiRoute("WebApi", "api/{controller}"); 
    }); 
} 

을이 작은 구성 후 당신이 당신의 컨트롤러를 상속 할 수 있습니다 웹 API 또는 기본 asp.net에서 이동의 편의를 위해 위의 패키지에 추가됩니다 ApiController에서 코어 Controller. ApiController의 예 :

public class SomeController : ApiController { 
    // maps to GET /api/Some 
    // note - no routing attributes anywhere 
    public HttpResponseMessage Get() { 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 

    // maps to POST /api/Some 
    public HttpResponseMessage Post() { 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 
} 

기본 asp.net 코어 컨트롤러 :

[UseWebApiRoutes] 
[UseWebApiActionConventions]  
public class BaseController : Controller { 

} 

public class TestController : BaseController { 
    // maps to GET /api/Test 
    // no attributes 
    public IActionResult Get(string p) { 
     return new ObjectResult(new { Test = p }); 
    } 
} 

당신이 웹에서 마이그레이션하지 않는 경우 : 당신은 이러한 속성을 사용하여 기본 컨트롤러를 표시 할 수 있습니다

// mark with these attributes for it to work 
[UseWebApiRoutes] 
[UseWebApiActionConventions] 
public class TestController : Controller { 
    // maps to GET /api/Test 
    // no routing attributes, but two "conventions" attributes 
    public IActionResult Get(string p) { 
     return new ObjectResult(new { Test = p }); 
    } 
} 

api - 네이티브 Controller을 사용하는 것이 좋습니다. ApiController에는 다른 구조 (asp.net 웹 API ApiController와 유사)가 있으므로 의도 한 목표 (웹 API에서 마이그레이션) 이외의 용도로 사용할 이유는별로 없습니다.

1

MapRoute 여전히 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing

특성 라우팅 칭찬 MapRoute, 그것을이 대체하지 않습니다.

분명히 예를 단순화하기 위해 Routing에 관한 부분을 삭제하는 예제가 꽤 있습니다. 그래서 국물을 파다.

+0

예'MapRoute'은 여전히 ​​존재하지만'MapHttpRoute'는 언급되지 않았습니다 - 그들은 완전히 다른 경로 매핑을 제공합니다. 'MapRoute'은 url 질의 문자열에서 컨트롤러의 액션 메소드까지의 매핑을 제공하며, MapHttpRoute은 HTTP-verb와 질의 문자열을 API 컨트롤러의 verb-methods에 맵핑하여 제공됩니다. – rufanov

+0

'MapRoute'을 사용하면 리소스 (REST-api의 본질)와는 다른 일을하기 위해 다른 http 동사와 함께 호출 할 수있는'api/something'와 같은 단일 명명 된 REST 리소스를 아카이브 할 수 없습니다 - MapRoute은'api/something/post','api/something/delete','api/something/put','api/something/putstrange'의 네 가지 URL을 매핑 할 것입니다. – rufanov