ASP.NET 웹 API IHttpController 꾸미기

스티븐

IHttpController데코레이터로 Web API 컨트롤러 ( 구현) 를 래핑하려고하는데 , 이렇게하면 Web API가 예외를 던집니다. 어떻게 든 실제 구현을 기대하기 때문입니다.

컨트롤러에 데코레이터를 적용하는 것은 MVC 컨트롤러에 성공적으로 적용하는 트릭이며 Web API에서도 동일하게 적용하고 싶습니다.

IHttpControllerActivator장식 된 IHttpController구현을 해결할 수 있는 사용자 지정 만들었습니다 . 다음은 제거 된 구현입니다.

public class CrossCuttingConcernHttpControllerActivator : IHttpControllerActivator {
    private readonly Container container;
    public CrossCuttingConcernHttpControllerActivator(Container container) {
        this.container = container;
    }

    public IHttpController Create(HttpRequestMessage request, 
        HttpControllerDescriptor controllerDescriptor, Type controllerType)
    {
        var controller = (IHttpController)this.container.GetInstance(controllerType);

        // Wrap the instance in one or multiple decorators. Note that in reality, the 
        // decorator is applied by the container, but that doesn't really matter here.
        return new MyHttpControllerDecorator(controller);
    }
}

내 데코레이터는 다음과 같습니다.

public class MyHttpControllerDecorator : IHttpController {
    private readonly IHttpController decoratee;
    public MyHttpControllerDecorator(IHttpController decoratee) {
        this.decoratee = decoratee;
    }

    public Task<HttpResponseMessage> ExecuteAsync(
        HttpControllerContext controllerContext,
        CancellationToken cancellationToken)
    {
        // this decorator does not add any logic. Just the minimal amount of code to
        // reproduce the issue.
        return this.decoratee.ExecuteAsync(controllerContext, cancellationToken);
    }
}

그러나 내 응용 프로그램을 실행하고을 요청하면 ValuesControllerWeb API가 다음을 던집니다 InvalidCastException.

'WebApiTest.MyHttpControllerDecorator'유형의 개체를 'WebApiTest.Controllers.ValuesController'유형으로 캐스팅 할 수 없습니다.

Stacktrace :

at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.<>c__DisplayClass5.<ExecuteAsync>b__4()
at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)

마치 Web API가 IHttpController추상화를 제공하지만이를 건너 뛰고 구현 자체에 의존하는 것과 같습니다. 이것은 물론 종속성 반전 원칙을 심각하게 위반하고 추상화를 완전히 쓸모 없게 만듭니다. 그래서 나는 아마도 대신 뭔가 잘못하고있을 것입니다.

내가 뭘 잘못하고 있니? 내 API 컨트롤러를 어떻게 행복하게 꾸밀 수 있습니까?

Radim Koehler

ASP.NET Web API에서이 동작을 달성하는 자연스럽고 설계된 방법은 사용자 지정 메시지 처리기 / 위임 처리기를 사용하는 것입니다.

예를 들어 나는 이것을 DelegationHandler제자리에 가지고 있습니다.

public class AuthenticationDelegationHandler : DelegatingHandler
{
    protected override System.Threading.Tasks.Task<HttpResponseMessage> 
        SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // I. do some stuff to create Custom Principal
        // e.g.
        var principal = CreatePrincipal();
        ...

        // II. return execution to the framework            
        return base.SendAsync(request, cancellationToken).ContinueWith(t =>
        {
            HttpResponseMessage resp = t.Result;
            // III. do some stuff once finished
            // e.g.:
            // SetHeaders(resp, principal);

            return resp;
        });
    }

그리고 이것은 구조에 그것을 주입하는 방법입니다.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MessageHandlers.Add(new AuthenticationDelegationHandler());

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ASP.net MVC 웹 API + Android

분류에서Dev

Facebook Deauthorization ASP.NET 웹 API

분류에서Dev

DryIoc ASP.NET 5 웹 API

분류에서Dev

Asp.net 웹 API 구성

분류에서Dev

C # Asp.net 웹 API-JSON / XML 변환기 API 만들기

분류에서Dev

ASP.NET 웹 API 2 자르기 JSON 응답

분류에서Dev

웹 API HttpContext에 ASP.NET MVC HttpContext 보내기

분류에서Dev

Asp.net 웹 API Httpresponsemessage에서 Javascript FormData 값 읽기

분류에서Dev

C # ASP.NET Core 웹 API 포함

분류에서Dev

Asp.Net Mvc 웹 API 라우팅 404

분류에서Dev

asp.net 웹 API HTTP PUT 방법

분류에서Dev

asp.net 웹 API 2로 인증

분류에서Dev

각도 $ http 사용 asp net 웹 API

분류에서Dev

각도 $ http 사용 asp net 웹 API

분류에서Dev

Asp.net 웹 API 서비스

분류에서Dev

ASP.Net 웹 API 작업 결과

분류에서Dev

ASP.NET 웹 API의 xml 직렬화

분류에서Dev

415 ASP.NET Core 웹 API에서 지원되지 않는 미디어 유형

분류에서Dev

asp.net 웹 API에 대한 웹 사이트 호출-이미지 업로드 실패

분류에서Dev

asp.net 웹 API에서 데이터를 사용하기위한 asp.net MVC 디자인 패턴

분류에서Dev

웹 API를 호출하는 ASP .Net Core 웹 앱

분류에서Dev

ASP.NET 웹 API 비동기 클라이언트가 필요합니까?

분류에서Dev

ASP.NET 웹 API 비동기 클라이언트가 필요합니까?

분류에서Dev

Asp.net 웹 API 2 웹 클라이언트와 웹 서버 개발 분리

분류에서Dev

Asp.net 웹 API를 사용하는 AKKA.NET

분류에서Dev

기존 asp.net 웹앱을 통해 IIS에 asp.net 웹앱 게시

분류에서Dev

ASP MVC 4 + 웹 API

분류에서Dev

Odata asp.net 코어 2.2 웹 API 페이지 매김

분류에서Dev

Open Policy Agent를 ASP.Net Core 웹 API와 통합

Related 관련 기사

뜨겁다태그

보관