【问题标题】:HttpClient SendAsync Cannot access a disposed object ResponseHeadersReadHttpClient SendAsync 无法访问已释放的对象 ResponseHeadersRead
【发布时间】:2018-10-10 15:10:44
【问题描述】:

我正在研究一些将 Http 请求中继到另一个 URL 的遗留代码的问题。它是一个 API 控制器,它读取请求并将其异步转发到另一个地址。

极少情况下,它会引发“无法访问已处置的对象”异常 - 本问题后面会显示完整的堆栈跟踪。它似乎在 HttpClient 调用 SendAsync 方法的地方。我认为这可能是 ResponseHeadersRead 选项 - 我怀疑它正在发送一个大数据包并且它被关闭,因为它刚刚读取了标题并退出。只是想我会和你们一起理智地检查一下,为了你们的想法。我会将选项更改为 ResponseContentsRead 选项,看看效果如何(但错误可能需要很长时间才能浮出水面)。

代码如下:

        using (var client = new HttpClient())
        {
            var request = BuildRelayHttpRequest(Request);
            await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
        }


        private static HttpRequestMessage BuildRelayHttpRequest(HttpRequestMessage incomingRequest)
        {
            var forwardToUrl = new Uri(ConfigurationManager.AppSettings["ForwardFeedURL"]);
            var relayRequest = new HttpRequestMessage(incomingRequest.Method, forwardToUrl);
            if (incomingRequest.Method != HttpMethod.Get && incomingRequest.Content != null)
            {
                relayRequest.Content = incomingRequest.Content;
            }

            //Copies contents
            relayRequest.Content = incomingRequest.Content;
            return relayRequest;
        }

这里是个例外:

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Web.Http.WebHost.HttpControllerHandler+LazyStreamContent'.
   at System.Net.Http.HttpContent.CheckDisposed()
   at System.Net.Http.HttpContent.CopyToAsync(Stream stream, TransportContext context)
   at System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at CHO.Web.Services.ETrains.Controllers.ETrainsApiController.<CopyandForwardFeedAsyn>d__18.MoveNext() in \Controllers\MyAPIController.cs:line 289

注意,第 289 行是“await client.SendAsync”代码行

【问题讨论】:

    标签: c# asp.net-web-api2


    【解决方案1】:

    很可能是服务器设置了错误代码。

    使用封装在 Try Catch 块中的 response.EnsureSuccessStatusCode(); 跟踪您的代码:

    try
    {
        var request = BuildRelayHttpRequest(Request);
        await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
        response.EnsureSuccessStatusCode();
        // Handle success
    }
    catch (HttpRequestException)
    {
        // Handle failure
    }   
    

    【讨论】:

    • 谢谢 - 现在将使用它来尝试收集更多信息,以了解它可能无法转发的原因。将查看进展情况并更新调查结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    相关资源
    最近更新 更多