C# HttpClient.SendAsync HttpException:客户端已断开连接

C# HttpClient.SendAsync HttpException:客户端已断开连接,c#,asp.net,asp.net-web-api,dotnet-httpclient,C#,Asp.net,Asp.net Web Api,Dotnet Httpclient,我有一个ASP.NET web API应用程序托管在Windows Azure web角色中。 此应用程序的目的是将Http请求代理到其他启用web的端点,例如服务总线中继,并返回它们的响应 有时,我们的应用程序在发送具有重要(>5MB)负载的请求时抛出异常。这种情况可能发生在负载较大的20个请求中的1个 异常详细信息:System.AggregateException:一个或多个错误 发生。-->System.Web.HttpException:客户端已断开连接。 在System.Web.Ho

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

有时,我们的应用程序在发送具有重要(>5MB)负载的请求时抛出异常。这种情况可能发生在负载较大的20个请求中的1个

异常详细信息:System.AggregateException:一个或多个错误 发生。-->System.Web.HttpException:客户端已断开连接。
在System.Web.Hosting.IIS7WorkerRequest.EndRead(IAsyncResult 异步结果)在 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 异步结果)在 System.Net.Http.StreamToStreamCopy.BufferReadCallback(IAsyncResult
ar)尝试返回任务版本,然后将同步代码替换为异步。不再使用“.Results”之类的东西,而是使用“wait”关键字,并在方法上添加“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();
            })
        };
    }
}
公共类代理控制器:ApiController
{
私有静态只读HttpClient HttpClient=新HttpClient();
私有静态只读Uri BaseUri=新Uri(“http://webendpoint.com");
公共异步任务Post()
{
var newUri=newUri(BaseUri,Request.RequestUri.PathAndQuery);
var request=newhttprequestmessage(HttpMethod.Post,newUri)
{
Content=Request.Content
};
var response=wait-HttpClient.sendaync(请求,HttpCompletionOption.ResponseHeadersRead);
返回新的HttpResponseMessage(response.StatusCode)
{
内容=新的PushStreamContent(异步(流、内容、ctx)=>
{
var tempStream=await response.Content.ReadAsStreamAsync();
等待tempStream.CopyToAsync(流);
stream.Flush();
stream.Close();
})
};
}
}

很难帮助您调试代码,因为您必须从内存中编写代码,因为它充满了错误。然而,如果你真的只是创建一个代理,我建议你做的第一件事就是只使用一个DelegatingHandler,而不必麻烦使用ApiController。公平地说,我并没有帮你任何忙。我的错。更新。
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();
            })
        };
    }
}