7

Route Attributes를 사용하는 특정 컨트롤러에 대해서만 MessageHandler를 추가 할 수 있습니까?ASP.NET WebAPI 2에서 라우팅 속성을 사용하는 특정 컨트롤러에 MessageHandler를 추가하는 방법은 무엇입니까?

특정 헤더가 포함되어 있지 않으면 파이프 라인의 앞부분에서 요청을 자르고 싶습니다. 는 언급에 내가 원하는 :

  • 내가 WebApiConfig 다른 경로를 추가 할 수 없습니다, 우리는 라우팅 컨트롤러에서 속성을 사용해야합니다.

  • 전 세계적으로 MessageHandler를 추가하고 싶지 않습니다.

  • 은 (초기 파이프 라인 단위)에 messageHandler 수 있습니다. 우리에게는 대안이 있지만 더 효율적으로하기 위해 노력하고 있습니다. API/myapicontroller 국도 ("")와 하나 개의 동작 :

예를 들어, 나는 다음과 같은 RoutePrefix와 컨트롤러를 장식했습니다. 그런 다음

(나는 이상한 알고, 우리가 쿼리 문자열에 따라 다른 행동을 선택하는 것), 나는 myMessageHandler가 실행 config.MapHttpAttributeRoutes(); 전에이 코드를 넣으면 내가

config.Routes.MapHttpRoute(
     name: "CustomRoute", 
     routeTemplate: "api/myapicontroller/{id}", 
     defaults: new { id = RouteParameter.Optional }, 
     constraints: null, 
     handler: new myMessageHandler() 
    );  

추가했지만 나는이 메시지를 얻을 수 :

조치가 요청과 일치하는 컨트롤러의 myapicontroller '에서 찾을 수 없습니다

config.MapHttpAttributeRoutes();을 먼저 넣으면 myMessageHandler가 실행되지 않지만 myapicontroller 내부의 my action이 호출됩니다.

+0

[이 문서 (https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/http-message-handlers) 같지만 MapHttpRoute' '를 사용한다. 그러나 그것은 '속성 라우팅 (Attribute Routing)'을지지하지 않습니다. –

답변

-1

이 문서의 MS docs은 동일한 내용을 설명합니다. 마침내 컨트롤러 고유의 핸들러를 제공 할 수있는 방법을 제공합니다.하지만 기존의 라우팅을위한 것입니다. 이것이 당신을 돕는 지 알지 못합니다.

config.Routes.MapHttpRoute(
    name: "MyCustomHandlerRoute", 
    routeTemplate: "api/MyController/{id}", 
    defaults: new { controller = "MyController", id = RouteParameter.Optional }, 
    constraints: null, 
    handler: HttpClientFactory.CreatePipeline(new HttpControllerDispatcher(config), new MyCustomDelegatingMessageHandlerA()); 
); 
+0

메시지를 보내 주셔서 감사합니다. 그러나 라우팅 속성을 사용하여 새로 생성 된 경로에 도달하지 않습니다 (라우팅 속성은 기존 라우팅보다 우선 순위가 높음). –

+0

예. 나는 그것을 들여다 볼 것이다. 내가 뭐든 찾으면 알려줘. –

0

불행히도 AttributeRouting을 통해 핸들러를 설정할 수 없습니다. 특정 경로에 처리기를 할당하려면 MapHttpRoute을 통해서만 등록해야합니다. 당신은 아제 Aradhya의 대답처럼 defaults 섹션에서 컨트롤러 이름을 추가하고 당신도 동시에 Route 속성 또는 MapHttpRoute 방법,하지만 모두 경로를 등록 할 수 있기 때문에, 당신의 행동에서 Route 속성을 제거해야하는 경우를 제외하고.

또한 당신이 그렇지 않으면 핸들러는 작동하지만 요청은 컨트롤러 액션을 공격하지 않을 것이다, 파이프 라인을 만들 필요가 있습니다. 자세한 내용은 비슷한 질문 인 my answer을 참조하십시오.