dotnet / dotnet/runtime

System.Net.Http.HttpIOException: The response ended prematurely

Open
#122,583 4 comments 0 reactions 0 assignees View on GitHub
area-System.Net.Http question
Dominant language
C#
Stars
18.3k
Forks
5.6k
PR merge metrics
PR metrics pending

Description

We try to migrate our .NetFramework application to .NetCore 8.0.
Our Application process thousands of requests per minute.

After this migration, we get 30/40 errors per day. (different times / different load periods – It does not depends load traffic)
How do we fix this error? Do you have any suggestions about code?

Trace:
```
System.Net.Http.HttpRequestException: An error occurred while sending the request.
---> System.Net.Http.HttpIOException: The response ended prematurely. (ResponseEnded)
at System.Net.Http.HttpConnection.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at System.Net.Http.HttpConnection.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.AuthenticationHelper.SendWithNtAuthAsync(HttpRequestMessage request, Uri authUri, Boolean async, ICredentials credentials, Boolean isProxyAuth, HttpConnection connection, HttpConnectionPool connectionPool, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
at System.Net.Http.AuthenticationHelper.SendWithAuthAsync(HttpRequestMessage request, Uri authUri, Boolean async, ICredentials credentials, Boolean preAuthenticate, Boolean isProxyAuth, Boolean doRequestAuth, HttpConnectionPool pool, CancellationToken cancellationToken)
at System.Net.Http.DiagnosticsHandler.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.DecompressionHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
```
Code:
```c#
using (var serviceScope = SiriusServiceScopeFactory.Instance.CreateScope())
{
var client = serviceScope.GetHttpClient(HttpClientConstants.CoreHttpClient);
using (var httpRequest = new HttpRequestMessage(HttpMethod.Post, requestUri))
{
SetHttpHeaders(httpRequest);

byte[] zippedBytes;
using (var ms = new MemoryStream())
{
CoreGZipUtils.Zip(ms, request);
zippedBytes = ms.ToArray();
}

HttpContent content = new ByteArrayContent(zippedBytes);
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

httpRequest.Content = content;
using (var cts = new CancellationTokenSource(timeout))
{
HttpResponseMessage response = null;
try
{
response = await client.SendAsync(httpRequest, cts.Token).ConfigureAwait(false);
}
catch (TaskCanceledException ex)
{
throw new SrSystemException(string.Empty, string.Format("Timeout exception occured while connecting to plm. PLM Uri:{0}, Service Name:{1}, Timeout:{2} second", this.plmUri, this.corePlmClientHeaderInfo.ServiceName, timeout));
}
return await ReadHttpResponseFromMessageAsync(response).ConfigureAwait(false);
}
}
}

internal static IServiceCollection AddCoreHttpClient(this IServiceCollection services)
{
services.AddHttpClient(HttpClientConstants.CoreHttpClient).ConfigurePrimaryHttpMessageHandler(x =>
new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
UseCookies = false,
AllowAutoRedirect = false,
UseDefaultCredentials = true,
});

return services;
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.