Development Tip

속성 라우팅 및 상속

yourdevel 2020. 11. 21. 09:08
반응형

속성 라우팅 및 상속


저는 제 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

반응형