2012-10-19 43 views
9

Tôi có logic xác thực trong một lớp, bắt nguồn từ System.Web.Http.AuthorizeAttribute (ghi đè phương thức OnAuthorization). Tôi thực hiện cuộc gọi đến một DB từ phương thức đó và tôi muốn cuộc gọi đó không đồng bộ (may mắn thay, API async ADO.NET mới cho phép điều đó).bộ lọc hành động không đồng bộ: Async & AuthorizeAttribute trong ASP.NET WEB API

Sau đó, tôi áp dụng thuộc tính này cho bộ điều khiển để có tất cả các cuộc gọi đến nó đi qua bộ lọc xác thực. Càng xa càng tốt.

Nhưng làm như vậy tôi gặp phải sự cố sau. Khung công tác (ASP.NET Web API) dường như không nhận thức được ý định của tôi là gì :) Có vẻ như nó tiến hành thực hiện hành động của bộ điều khiển trước khi các phương thức OnAuthorizaion của bộ lọc kết thúc (trả về từ cuộc gọi async). ngoại trừ khung công tác "xử lý yêu cầu hoàn tất trước khi tất cả các hoạt động không đồng bộ xuất sắc hoàn tất .."

Có cách nào để giải quyết vấn đề đó không?

Cảm ơn!

P.S. Cảm giác ruột của tôi nói rằng tôi đang ở để tạo bộ lọc hành động tùy chỉnh .. Sau đó, tôi cần ghi đè ExecuteActionFilterAsync và thực hiện xác thực của mình ở đó xử lý tất cả các công việc liên quan đến Tác vụ mà không có sự trợ giúp từ phía khung công tác ..)

+0

Tất cả các giao diện bộ lọc mà Khung cung cấp cho bạn, là không đồng bộ. Tôi cho rằng bạn đang làm việc với các triển khai mặc định của những người triển khai các API đồng bộ. làm việc với 'IAuthorizationFilter' như được đề xuất trong câu trả lời dưới đây. – tugberk

Trả lời

5

Ok, đây là những gì tôi đã đưa ra (sau khi tham gia một peek dưới mui xe với phản xạ):

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) 
    } 
} 

bằng cách này, được áp dụng cho một bộ điều khiển/hành động, tất cả các logic sẽ được thực hiện theo đúng thứ tự trong khi vẫn giữ luồng được bỏ chặn trong I/O. Tuy nhiên, không phải rất tôn trọng để hủy bỏ. Nhưng sẽ không sao cho các mục đích của tôi ..

Dù sao, tôi thực sự tự hỏi điều gì làm cho người tạo Web API không đi theo cách tương tự ... Ý tưởng?

Các vấn đề liên quan