2015-04-02 42 views
7

我們最近通過使用存儲在Azure文檔數據庫中的憑據實現自定義AuthorizationFilterAttribute來實現API身份驗證。 DocDB要求一切都使用異步。WebApi2何時使用OnAuthorizationAsync vs OnAuthorization

通過實驗我們發現WebApi2同步控制器將使用OnAuthorizationAsync(如果存在)以及OnAuthorization(如果沒有異步方法)。我們還發現asyc控制器方法可以使用auth方法。但我不是100%確定它工作正常。我們只看到代碼確實觸及了斷點。

奇怪的是,你還可以覆蓋OnAuthorization將其標記爲異步

public async override Task OnAuthorization(....)

這最後一種方法編譯和執行罰款,但控制器將不會等待身份驗證過濾器執行完操作方法開始之前。通常的結果是一個ASP錯誤:

An asynchronous module or handler completed while an asynchronous operation was still pending

好像這個操縱覆蓋的應該是一個編譯錯誤,並不允許的。

無論如何......關於AuthorizationFilterAttribute還有很多謎團,還有一些關於混淆的帖子。 Custom Authorization in Asp.net WebApi - what a mess?

我的問題是你如何知道哪個執行順序和哪個優先順序?它確實出現,如果兩者都存在於過濾器中,則只執行一個方法。

  1. 如果您的控制器操作是異步的,您是否必須重寫OnAuthorizationAsync方法?

  2. 如果你的auth邏輯中有async等待,並且被迫使用OnAuthorizationAsync(像我一樣),那麼這是否意味着我必須將所有控制器動作改爲現在都是異步控制器動作?

我找不到任何說明異步操作過濾器場景的文檔。

+0

如果在兩者中都放置斷點,您會發現首先調用OnAuthorizationAsync;如果您在OnAuthorization被調用時檢查調用堆棧,則會在執行base.OnAuthorizationAsync()期間看到它被調用。 – mjohnsonengr 2016-03-27 03:52:40

回答

7

如果你看一看AuthorizationFilterAttribute的源代碼,那麼你可以看到,OnAuthorizationAsync基實現實際上是調用OnAuthorization之一。

public virtual void OnAuthorization(HttpActionContext actionContext) 
{ 
} 

public virtual Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken) 
{ 
    try 
    { 
     OnAuthorization(actionContext); 
    } 
    catch (Exception ex) 
    { 
     return TaskHelpers.FromError(ex); 
    } 

    return TaskHelpers.Completed(); 
} 

正如您所看到的,您實際上可以覆蓋任何您想要的方法,而無需調用基礎實現。只要選擇一種更適合您的情況的產品 - 控制器是否是異步無關緊要。

和關於有關標記OnAuthorization本身作爲異步你的問題 - 代碼編譯因爲這是方式C#異步支持設計的,但它確實會導致調用代碼不等待異步部分來完成(實際上可以不要等待,因爲方法標記爲async void而不是異步任務。您可以閱讀更多關於異步避免here

相關問題