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上创建新项目,当我这样做时,所有问题都已修复。