속성 라우팅 및 상속
저는 제 API 컨트롤러에 대한 기본 CRUD 메서드를 제공하기 위해 일반 저장소를 사용하는 기본 컨트롤러가 있다는 아이디어를 가지고 놀아서 각각의 새 컨트롤러에서 동일한 기본 코드를 복제 할 필요가 없습니다. 그러나 기본 컨트롤러에있을 때 인식되는 라우팅 속성에 문제가 있습니다. 내가 가진 문제를 정확히 보여주기 위해 정말 간단한 WebAPI 컨트롤러를 만들었습니다.
나는이 때 Get
메인 컨트롤러의 방법과는 상속 ApiController
직접 예상대로 나는 어떤 문제와이 작품이 없습니다.
[RoutePrefix("admin/test")]
public class TestController : ApiController
{
[Route("{id:int:min(1)}")]
public string Get(int id)
{
return "Success";
}
}
Get
메서드를 기본 컨트롤러로 이동 하면 404 페이지의 내용이 반환됩니다.
[RoutePrefix("admin/test")]
public class TestController : TestBaseController
{
}
public class TestBaseController : ApiController
{
[Route("{id:int:min(1)}")]
public string Get(int id)
{
return "Success";
}
}
더 흥미로운 메모 :
에서 작업에 액세스 할 수 있습니다
GET
/Test/1
. 그래서 그것은 여전히 기본 경로를 기반으로 찾는 것입니다.에 액세스하려고
POST
/admin/test
하면 다음 JSON이 반환됩니다.{ "Message": "요청 URI ' http://test.com/admin/test ' 와 일치하는 HTTP 리소스를 찾을 수 없습니다 .", "MessageDetail": " 'admin'이라는 컨트롤러와 일치하는 유형을 찾을 수 없습니다. " }
누구든지 기본 컨트롤러의 속성과 함께 작동하도록 라우팅을 얻는 방법을 알고 있습니까?
속성 경로는 상속 될 수 없습니다. 이것은 의도적 인 디자인 결정이었습니다. 우리는 옳다고 생각하지 않았고 상속하는 것이 합리적 일 수있는 유효한 시나리오를 보지 못했습니다.
이것을 어디에 사용할 것인지에 대해보다 현실적인 시나리오를 제공 할 수 있습니까?
[ 업데이트 (
2014 년 3 월 24 일)] MVC Web API의 다가오는 5.2 릴리스 System.Web.Http.Routing.IDirectRouteProvider
에서는 여기에서 찾고있는 상속 시나리오를 활성화 할 수 있는 확장 지점이 호출 될 예정 입니다. 최신 야간 빌드를 사용하여 직접 시도해 볼 수 있습니다 (야간 빌드 사용 방법에 대한 문서는 여기 참조 ).
[ 업데이트 (2014 년 7 월 31 일)]
Web API 2.2
릴리스 에서이 작업을 수행하는 방법의 예 :
config.MapHttpAttributeRoutes(new CustomDirectRouteProvider());
//---------
public class CustomDirectRouteProvider : DefaultDirectRouteProvider
{
protected override IReadOnlyList<IDirectRouteFactory>
GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
{
// inherit route attributes decorated on base class controller's actions
return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>
(inherit: true);
}
}
Web API 2.2를 사용하여 다음을 수행 할 수 있습니다.
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);
}
}
여기에 설명 된대로 : http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-22
알았다.
[Route("api/baseuploader/{action}")]
public abstract class BaseUploaderController : ApiController
{
[HttpGet]
public string UploadFile()
{
return "UploadFile";
}
}
[Route("api/values/{action}")]
public class ValuesController : BaseUploaderController
{
[HttpGet]
public string Get(int id)
{
return "value";
}
}
여기서 한 가지주의 할 점은 경로 작업 매개 변수가 작업 이름과 동일해야한다는 것입니다. 나는 그것을 피할 방법을 찾을 수 없었다. (RouteAttribute로 경로 이름을 바꿀 수 없습니다.)
참고URL : https://stackoverflow.com/questions/19989023/attribute-routing-and-inheritance
'Development Tip' 카테고리의 다른 글
Log.wtf ()는 Log.e ()와 어떻게 다릅니 까? (0) | 2020.11.21 |
---|---|
"Hello, World!"는 무엇입니까? (0) | 2020.11.21 |
Dagger와 ButterKnife Android의 차이점 (0) | 2020.11.21 |
명부 (0) | 2020.11.21 |
Xcode 7의 기존 프로젝트에 단위 및 UI 테스트 추가 (0) | 2020.11.21 |