I am using .NET 6 to develop the core Web API, I have a abstract class AdminApiClient inherit ApiClientBase class like below:
public abstract class AdminApiClient : ApiClientBase
{
protected static HttpClient? client;
public AdminApiClient()
{
client = client ?? new HttpClient
{
BaseAddress = new Uri("http://localhost:44355/")
};
}
protected override HttpClient GetHttpClient()
{
return client;
}
}
Below is my ApiClientBase class, When I call the Test method, declare new httpClient inside method is working fine, but when calling GetHttpClient() throw exception.
public abstract class ApiClientBase
{
protected abstract HttpClient GetHttpClient();
protected async Task<TResult> Test<TResult>()
{
var apiName = "api/users/GetTest";
var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://localhost:44355/");
//working fine
var response1 = await httpClient.GetAsync(apiName);
//throw error exception
var response2 = await GetHttpClient().GetAsync(apiName);
}
}
I am not sure why using code below is fine.
var response1 = await httpClient.GetAsync(apiName);
But throw exception when using code below:
var response2 = await GetHttpClient().GetAsync(apiName);
Exception message:
"System.Net.Http.HttpRequestException: An error occurred while sending the request.\r\n ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host..\r\n ---> System.Net.Sockets.SocketException (10054): An existing connection was forcibly closed by the remote host.\r\n --- End of inner exception stack trace ---\r\n at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)\r\n at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource<System.Int32>.GetResult(Int16 token)\r\n at System.Net.Http.HttpConnection.InitialFillAsync(Boolean async)\r\n
at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)\r\n --- End of inner exception stack trace ---\r\n at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, Boolea n async, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)\r\n at System.Net.Http.DiagnosticsHandler.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)\r\n at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpClient.g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)\r\n at Web.Core.ApiClientBase.Test() in C:\Web.Core\ApiClientBase.cs:line 76"
CodePudding user response:
Behaviour is different because the addresses are different:
http://localhost:44355/
https://localhost:44355/
It looks like the API you're connecting to is http only (despite using the https-ish port 44355).
Please note that you should be able to reproduce the issue in your browser by trying to go to both addresses.
CodePudding user response:
IHttpClientFactory.GetHttpClient Method
Method returning an Http client that will be used to communicate with Azure AD. This enables advanced scenarios. See https://aka.ms/adal-net-application-configuration
Provides a class for sending HTTP requests and receiving HTTP responses from a resource identified by a URI.
Note
It sounds like GetHttpClient is used only for Azure Active Directory (Azure AD)