首页 > 解决方案 > 发送大型 JSON 文件 (>1 MB) 时,HttpClient.SendAsync 抛出 System.Net.Http.HttpRequestException

问题描述

我有一个以 RESTful 方式通过 HTTP 协议工作的外部 Web 服务。它可以接受相当大的 JSON 文档(从 1MB 到 20-30MB),进行一些转换并返回另一个大型 JSON 文档,其大小等于或不小于接受的 JSON 文档的大小。

通过 Postman 进行测试时,它工作得非常好。

我使用 ASP.NET Core 2.2 并尝试使用HttpClient. 我的应用程序接受数据,创建相同的 JSON 文档并将其发送到外部 Web 服务。

这是我使用的代码:

public async Task<TResponse> MakeRequest<TRequest, TResponse>(TRequest request)
{
        if (request == null)
            throw new ArgumentNullException(nameof(TRequest));

        var content = new StringContent(JsonConvert.SerializeObject(request));
        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        var httpRequestMessage = new HttpRequestMessage { Method = HttpMethod.Post, Content = content };

        var response = await _httpClient.SendAsync(httpRequestMessage);

        if (response.IsSuccessStatusCode)
        {
            string responseString = await response.Content.ReadAsStringAsync();
            var responseObject = JsonConvert.DeserializeObject<TResponse>(responseString);
            return (responseObject != null) ? responseObject : throw new InvalidOperationException();
        }
        throw new InvalidOperationException();
}

当 JSON 文档的大小很小时,它工作正常- 它适用于 4KB 文档、20KB 文档、200KB 文档,但从大约 800KB 文档开始,它抛出System.Net.Http.HttpRequestException并且内部System.IOException只有消息服务器返回了无效或无法识别的响应。.

它在线失败var response = await _httpClient.SendAsync(httpRequestMessage);

我尝试手动创建 HttpClient 对象或通过注入它IServiceCollection- 相同的行为。

services.AddHttpClient<IExternalWebServiceProxy, ExternalWebServiceProxy>()
            .ConfigureHttpClient(x =>
            {
                x.MaxResponseContentBufferSize = 1024 * 1000 * 100;
            });

有什么想法会导致问题吗?

更新 - exception.ToString() 消息:

System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.IO.IOException: The server returned an invalid or unrecognized response.
   at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithNtConnectionAuthAsync(HttpConnection connection, HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at XXX.XXX.XXX.Internals.NCANodeProxy.MakeRequest[TRequest,TResponse](TRequest request) in D:\Sources\XXX\XXX\XXX.XXX.Core\Internals\ExternalNodeProxy.cs:line 36
   at XXX.XXX.XXX.Services.CryptoService.SignFileDocument(SignFileCommand command) in D:\Sources\XXX\XXX\XXX.XXX.Core\Services\CryptoService.cs:line 134

标签: c#jsonasp.net-coredotnet-httpclient

解决方案


推荐阅读