【问题标题】:The operation was canceled. at System.Threading.CancellationToken.ThrowIfCancellationRequested()操作被取消。在 System.Threading.CancellationToken.ThrowIfCancellationRequested()
【发布时间】:2014-05-04 18:58:27
【问题描述】:

我正在使用最新版本的 WebAPI。我的 WebAPI 返回 RSS 提要数据。我用 blitz 进行了负载测试,下面是它的结果。

这次冲刺在 300 秒内产生了 115,908 次成功命中,我们 将 1.91 GB 的数据传入和传出您的应用程序。平均命中 386.36/秒的速率转换为约 33,381,504 次点击/天。这 平均响应时间为 410 毫秒。但是,您遇到了更大的问题: 0.87% 的用户在此高峰期间遇到超时或错误!

返回 RSS 的 WebAPI 代码如下。它使用来自 https://github.com/filipw/AspNetWebApi-OutputCache 的 OutPutCache 库

[AllowAnonymous]
        [CacheOutput(ServerTimeSpan = 14400)]
        [HttpGet]
        public async Task<HttpResponseMessage> GetRssData()
        {

            string responseFromServer = string.Empty;
            WebRequest request = WebRequest.Create("URL FOR MY RSS FEED HERE");


            using (WebResponse response = await request.GetResponseAsync())
            {
                using (Stream dataStream = response.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(dataStream))
                    {
                        responseFromServer = await reader.ReadToEndAsync();
                    }
                }
            }

            return new HttpResponseMessage() { Content = new StringContent(responseFromServer, Encoding.UTF8, "application/rss+xml") };

        }

以下是相同的错误日志

异常信息: 异常类型:OperationCanceledException 异常消息:操作已取消。在 System.Threading.CancellationToken.ThrowIfCancellationRequested()
在 System.Web.Http.WebHost.HttpControllerHandler.d__1b.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Web.Http.WebHost.HttpControllerHandler.d__7.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Web.Http.WebHost.HttpControllerHandler.d__0.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Web.TaskAsyncHelper.EndTask(IAsyncResult ar) 在 System.Web.HttpApplication.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar)

线程信息:

Stack trace:    at System.Threading.CancellationToken.ThrowIfCancellationRequested()   

在 System.Web.Http.WebHost.HttpControllerHandler.d__1b.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Web.Http.WebHost.HttpControllerHandler.d__7.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Web.Http.WebHost.HttpControllerHandler.d__0.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Web.TaskAsyncHelper.EndTask(IAsyncResult ar) 在 System.Web.HttpApplication.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar)

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api


    【解决方案1】:

    这看起来像是被取消的请求,被 Web API 自动取消。您通常可以忽略这些错误(从 Web API 5.2 开始,它们不会出现在全局错误处理中)。

    【讨论】:

    • 我有 5.2.2.0,但每次我取消 ajax 请求时,我仍然会遇到这些讨厌的错误。这很糟糕
    • @Toolkit,我们不知道您所描述的实际发生的情况。如果您可以在 aspnetwebstack.codeplex.com 中打开一个问题并上传一个重现项目,这将非常有用您能具体说明您遇到了什么异常吗?如果是TaskCancelledException,你可以放心地忽略它,但我们真的很想看看这个场景。
    • @Toolkit 如果您使用异常过滤器或 IExceptionHandler/IExceptionFilter,您也可以告诉我们
    • 我通过忽略此类错误来解决它。看到我的回答stackoverflow.com/a/25990396/631527我遇到了当我需要进行即时搜索并且我需要取消以前的ajax请求时,它不会与下一个重叠
    • 啊,注意Web API中有两种异常处理机制。您的答案是指异常过滤器,它们总是对 TaskCancelledException 做出反应。用户正在询问过滤掉它们的异常记录器和 GlobalExceptionHandlers。异常过滤器包装一个动作执行,而另外两个在用户代码或框架代码中到处报告异常(即使框架默认吞下异常)。所以看起来你的答案是有效的,只是针对一个不同的问题:)
    猜你喜欢
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    相关资源
    最近更新 更多