2

我有這個簡單的控制器,它的Get方法與Ajax調用通過實體框架存儲庫查找郵編。如何在ASP.NET Web API中處理OperationCanceledException?

[Authorize] 
public class ZipCodesApiController : AppApiController 
{ 
    public ZipCode Get(string zipCode) 
    { 
     return unitOfWork.ZipCodeRepository 
      .Get(x => x.Zip == zipCode) 
      .FirstOrDefault(); 
    } 
} 

在生產中,我的日誌顯示System.OperationCanceledException: The operation was canceled.拋出經常。我認爲發生的事情是用戶正在查看地址詳細信息頁面,但在ajax郵政編碼查找返回之前導航或關閉瀏覽器。我猜IIS是告訴我的控制器他們不再連接,.NET框架會拋出異常?

這似乎是無害的,但它似乎是一個壞主意,將調用ZipCodeRepository包裝在try中,並且有一個空的OperationCanceledException catch子句。

我已經使用了錯誤,它似乎在並行編程中出現很多,這並不是我特別熟悉的東西。

什麼是處理此異常的適當方法?我認爲這是可以忽略的,但我錯了嗎?應該提醒實體框架以便它可以清理一些東西(我的AppApiController至少有一個dispose方法)?

+0

只是FYI ...不是你的問題的答案,但在最新版本的Web API中,如果你有一個像這樣的公共異步任務獲取(字符串zipCode,CancellationToken標記)'的操作,你可以註冊令牌取消,這將在客戶端斷開連接的情況下調用。 –

+0

如果您在下游使用其他異步API,那麼傳遞此取消令牌是很好的,這樣您就可以讓他們有機會清理任何可能需要的東西 –

回答

3

我得到相同的異常在我的web API應用,不過,我可以用的Application_Error方法趕上他們在Global.asax.cs中

protected void Application_Error(object sender, EventArgs e) 
    { 
     Exception exception = Server.GetLastError(); 
     Response.Clear(); 
     OperationCanceledException httpException = exception as OperationCanceledException; 
     if (httpException != null) 
     { 
      var token = httpException.CancellationToken; 
      if (token.IsCancellationRequested) 
      { 
       // clear error on server 
       Server.ClearError(); 
       Request.Abort(); 
      } 
     } 
    } 

我不知道這是否是正確的。

-1

也可以在Visual Studio 2013上創建新項目,當我這樣做時,所有問題都已修復。