如何在ASP.NET Web API中处理OperationCanceledException?
问题描述:
我有这个简单的控制器,它的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方法)?
答
我得到相同的异常在我的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();
}
}
}
我不知道这是否是正确的。
答
也可以在Visual Studio 2013上创建新项目,当我这样做时,所有问题都已修复。
只是FYI ...不是你的问题的答案,但在最新版本的Web API中,如果你有一个像这样的公共异步任务获取(字符串zipCode,CancellationToken标记)'的操作,你可以注册令牌取消,这将在客户端断开连接的情况下调用。 –
如果您在下游使用其他异步API,那么传递此取消令牌是很好的,这样您就可以让他们有机会清理任何可能需要的东西 –