C# 任务取消异常导致Web API项目中出现内部服务器错误

C# 任务取消异常导致Web API项目中出现内部服务器错误,c#,asp.net,azure,C#,Asp.net,Azure,我有一个ASP.NET web API项目。我在Azure中有3个云服务托管在traffic manager端点后面。最近,有一些失败,我需要一些帮助来了解根本原因 流量比平时高,但通话正常。在某个时间窗口(大约10分钟)内,其中一个实例开始抛出内部服务器错误。甚至运行状况ping请求也引发了内部服务器错误。大约一两个小时前成功的API调用也失败了。下面提供了堆栈跟踪 System.Threading.Tasks.TaskCanceledException: A task was cancele

我有一个ASP.NET web API项目。我在Azure中有3个云服务托管在traffic manager端点后面。最近,有一些失败,我需要一些帮助来了解根本原因

流量比平时高,但通话正常。在某个时间窗口(大约10分钟)内,其中一个实例开始抛出内部服务器错误。甚至运行状况ping请求也引发了内部服务器错误。大约一两个小时前成功的API调用也失败了。下面提供了堆栈跟踪

System.Threading.Tasks.TaskCanceledException: A task was canceled.
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()
System.Threading.Tasks.TaskCanceledException:任务已取消。
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中
在System.Web.Http.Controllers.ApiControllerActionInvoker.d_u0.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中
在System.Web.Http.Controllers.ActionFilterResult.d_u2.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中
在System.Web.Http.Controllers.ExceptionFilterResult.d_u0.MoveNext()中
在我看来,这个问题与代码无关。一种可能是线程争用,但当我创建一个新的测试云服务并对其进行多次并行调用时,我得到了超时,但没有出现内部服务器错误

更新: 我们有一个类似于下面的请求处理程序,似乎ASP.NET framework正在通过处理程序中的取消令牌触发取消。我们已经验证了在执行处理程序后,控件不会流向控制器

public class RequestMessageHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (request == null)
            {
                throw new ArgumentException("RequestMessage is null");
            }

            MyEventSource.Log.HttpIncomingStart(request);

            return base.SendAsync(request, cancellationToken);
        }
    }
公共类RequestMessageHandler:DelegatingHandler
{
受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
if(请求==null)
{
抛出新ArgumentException(“RequestMessage为null”);
}
MyEventSource.Log.HttpIncomingStart(请求);
返回base.sendaync(请求、取消令牌);
}
}

您是否执行过“发射并忘记”任务?这可能是请求超时吗?请求超时表示CancellationToken。也许代码没有很好地处理这一点,只是抛出。HttpClient也有同样的缺点。@ScottChamberlain不,我们必须对API触发的后台处理进行检查。大多数API请求是通过进一步的API请求(到另一个服务)或数据库查询来提供的。