c# - 发送大型 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
解决方案
推荐阅读
- r - 如何在绘图前不过滤数据的情况下在 ggplot2 中绘制 plot_model x 轴项的子集?
- r - 在 reshape 后使用 pivot_wider() 将第一列分成两列
- python - 如何使用 api.add_resource 在不同的文件中路由?
- corestore - 获取对象时的 CoreStore Xcode 数据错误问题
- python - 通过 Librosa 中的 fft_frequencies() 函数获取频率
- spring-webflux - 如何使用 sprint webclient 解析 json 响应
- javascript - 如何使用 AJAX 方法将来自 Github Gist 的 JSON 数据存储到数组中?
- html - 在哪里可以找到视频 html 元素的参考,因为 MDN 缺少很多
- arrays - TypeError:“builtin_function_or_method”对象不可下标。得到这个数组
- android - adb:无法访问或未找到