【问题标题】:HttpClient.SendAsync HttpException: The Client DisconnectedHttpClient.SendAsync HttpException:客户端断开连接
【发布时间】:2013-05-23 08:00:38
【问题描述】:

我有一个托管在 Windows Azure Web 角色中的 ASP.NET Web API 应用程序。 此应用程序的目的是将 Http 请求代理到其他支持 Web 的端点 - 例如服务总线中继并返回它们的响应。

有时我们的应用程序在发送具有大量 (>5MB) 负载的请求时会引发异常。这可能会在 20 个负载较大的请求中发生 1 个。

异常详细信息:System.AggregateException:一个或多个错误 发生了。 ---> System.Web.HttpException:客户端断开连接。
在 System.Web.Hosting.IIS7WorkerRequest.EndRead(IAsyncResult asyncResult) 在 System.Web.HttpBufferlessInputStream.EndRead(IAsyncResult asyncResult) 在 System.Net.Http.StreamToStreamCopy.BufferReadCallback(IAsyncResult ar) --- 内部异常堆栈跟踪结束 --- --->(内部异常#0)System.Web.HttpException(0x800703E3):客户端断开连接。在 System.Web.Hosting.IIS7WorkerRequest.EndRead(IAsyncResult asyncResult) 在 System.Web.HttpBufferlessInputStream.EndRead(IAsyncResult asyncResult) 在 System.Net.Http.StreamToStreamCopy.BufferReadCallback(IAsyncResult ar)

我们使用 .NET 4.5 中的 System.Net.HttpClient 发送这些 Http 请求。

public class ProxyController : ApiController
{
    private static readonly HttpClient HttpClient = new HttpClient();
    private static readonly Uri BaseUri = new Uri("http://webendpoint.com");

    public HttpResponseMessage Post()
    {
        var newUri = new Uri(BaseUri, Request.RequestUri.PathAndQuery);
        var request = new HttpRequestMessage(HttpMethod.Post, newUri)
                {
                    Content = this.Request.Content
                };

        var task = HttpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
        task.Wait();
        var response = task.Result;
        return new HttpResponseMessage(response.StatusCode)
        {
            Content = new PushStreamContent((stream, content, ctx) =>
            {
                var tempStream = response.Content.ReadAsStreamAsync().Result;
                tempStream.CopyToAsync(stream).Wait();
                stream.Flush();
                stream.Close();
            })
        };
    }
}

对可能导致此问题的原因有什么想法吗?

【问题讨论】:

  • 很难帮助您调试该代码,因为您必须从内存中编写它,因为它充满了错误。但是,如果你真的只是创建一个代理,我建议的第一件事就是只使用 DelegatingHandler 而不要使用 ApiController。
  • 公平点,我并没有用那个代码给你任何好处。我的错。已更新。

标签: c# asp.net asp.net-web-api dotnet-httpclient


【解决方案1】:

尝试返回一个任务版本,然后用异步替换同步代码。没有更多“.Results”的东西,而是使用“await”关键字并将“asyc”关键字放在您的方法上。像这样的:

public class ProxyController : ApiController
{
    private static readonly HttpClient HttpClient = new HttpClient();
    private static readonly Uri BaseUri = new Uri("http://webendpoint.com");

    public async Task<HttpResponseMessage> Post()
    {
        var newUri = new Uri(BaseUri, Request.RequestUri.PathAndQuery);
        var request = new HttpRequestMessage(HttpMethod.Post, newUri)
        {
            Content = Request.Content
        };

        var response = await HttpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

        return new HttpResponseMessage(response.StatusCode)
        {
            Content = new PushStreamContent(async (stream, content, ctx) =>
            {
                var tempStream = await response.Content.ReadAsStreamAsync();
                await tempStream.CopyToAsync(stream);
                stream.Flush();
                stream.Close();
            })
        };
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2017-07-17
    • 2021-12-05
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多