2012-10-19 5 views
9

System.Web.Http.AuthorizeAttribute (재정 의하여 OnAuthorization 메서드)에서 파생 된 클래스에 내 인증 논리가 있습니다. 그 방법으로 DB를 호출하고, 비동기 호출을 원한다. (운 좋게도, 새로운 ADO.NET 비동기 API가 허용한다.)비동기 동작 필터 : ASP.NET 웹 API의 비동기 및 AuthorizeAttribute

그런 다음이 속성을 컨트롤러에 적용하여 모든 호출이 인증 필터를 통과하도록합니다. 여태까지는 그런대로 잘됐다.

하지만 다음과 같은 문제가 발생합니다. 프레임 워크 (ASP.NET 웹 API)는 내 의도가 무엇인지 알지 못하는 것 같습니다 :) 내 필터의 OnAuthorizaion 메서드가 끝나기 전에 컨트롤러의 액션 실행이 진행되는 것처럼 보입니다 (비동기 호출에서 반환 됨). 따라서 프레임 워크에서 예외 "모든 비동기 작업이 완료되기 전에 요청 처리가 완료되었습니다."

처리 할 수있는 기본 방법이 있습니까?

감사합니다.

P. 내 직감으로 나는 커스텀 액션 필터 생성을하고 있다고 말한다. 그렇다면 ExecuteActionFilterAsync를 오버라이드하고 거기에있는 모든 태스크 관련 물건을 직접 처리해야한다.)

+0

프레임 워크에서 제공하는 모든 필터 인터페이스는 비동기식입니다. 동기 API를 노출하는 구현의 기본 구현으로 작업하고 있다고 가정합니다. IAuthorizationFilter'를 사용하여 아래 답변에서 제안한대로 작업하십시오. – tugberk

답변

5

좋아, 여기에 내가 (반사경 후드 슬쩍 복용 후) 해낸 것입니다 : 컨트롤러/액션에 적용되는

public class SecurityFilterAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation) 
    { 
     await OnAuthentication(actionContext); 

     return actionContext.Response ?? await continuation(); 
    } 

    private async Task OnAuthentication(HttpActionContext actionContext) 
    { 
     //some lengthy I/O operations (XXXAsync/await) 
    } 
} 

이런 식으로, 모든 논리는 적절한 순서로 실행됩니다 입출력 중에는 스레드를 차단 해제 상태로 유지합니다. 아니 아주 취소 존중합니다. 하지만 내 목적을 위해 괜찮을 것입니다 ...

어쨌든, 나는 정말로 웹 API 제작자가 비슷한 방향으로 나아 가지 않게 만들었습니다. 아이디어?