Page 1 of 1

C# HttpClient löst zufällig eine System.NullReferenceException aus

Posted: 03 Jan 2025, 18:00
by Guest
Ich versuche, einen Drittanbieter anzurufen, um eine Authentifizierungszeichenfolge zu erhalten, damit ich einen zweiten Anruf tätigen kann, aber gelegentlich erhalte ich die folgende Fehlermeldung:
Image

Der Inhalt davon ist:

Code: Select all

System.NullReferenceException
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=System.Net.Http
StackTrace:
at System.Net.Http.HttpConnection.WriteAsciiString(String s)
at System.Net.Http.HttpConnection.WriteHeaderCollection(HttpHeaders headers, String cookiesFromContainer)
at System.Net.Http.HttpConnection.WriteHeaders(HttpRequestMessage request, HttpMethod normalizedMethod)
at System.Net.Http.HttpConnection.d__57.MoveNext()
at System.Net.Http.HttpConnection.d__57.MoveNext()
at System.Net.Http.HttpConnectionPool.d__89.MoveNext()
at System.Net.Http.DiagnosticsHandler.d__10.MoveNext()
at System.Net.Http.Metrics.MetricsHandler.d__5.MoveNext()
at System.Net.Http.RedirectHandler.d__4.MoveNext()
at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.d.MoveNext()
at Microsoft.Extensions.ServiceDiscovery.Http.ResolvingHttpDelegatingHandler.d__4.MoveNext()
at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.d.MoveNext()
at System.Net.Http.HttpClient.d.MoveNext()
at MyApiService.Clients.Party3rdClient.d__7.MoveNext() in Party3rdClient.cs:
Dies scheint zufällig zu sein und tritt auch bei anderen HttpClient-Aufrufen auf, die ich mache. Ich injiziere den HTTPClient in Abhängigkeit und frage mich, ob ich es vielleicht falsch mache (ziemlich neu in C#).
So sieht der Code aus (die Namen wurden geändert, um die Unschuldigen zu schützen):< /p>
Program.cs

Code: Select all

builder.Services.Configure
(builder.Configuration.GetSection("Party3rdSettings"));
builder.Services.AddTransient();
builder.Services.AddHttpClient(client =>
{
client.Timeout = TimeSpan.FromMinutes(5);
});
IPart3rdClient.cs

Code: Select all

namespace MyApiService.Clients.Interfaces
{
public interface IParty3rdClient
{
public Task GetAuthentication(AuthFields authFields);
}
}
3rdPartClient.cs

Code: Select all

namespace MyApiService.Clients
{

public class Part3rdClient: IPart3rdClient
{
private readonly Party3rdSettings _party3rdSettings;
private readonly HttpClient _client;
private static string Authentication = string.Empty;

private static readonly JsonSerializerOptions jsonOptions = new ()
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};

public Part3rdClient(IOptions
 party3rdSettings, HttpClient client)
{
_party3rdSettings= party3rdSettings.Value;
_client = client;
}

public async Task GetAuthentication(AuthFields authFields)
{
try
{
using var request = new HttpRequestMessage(HttpMethod.Post, party3rdSettings.AuthConnectionString);
var authenticationString = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{party3rdSettings.UserName}:{party3rdSettings.Password}"));
_client.DefaultRequestHeaders.Clear();
var base64EncodedAuthenticationString = Convert.ToBase64String(Encoding.ASCII.GetBytes(authenticationString));
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authenticationString);
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
string body = JsonSerializer.Serialize(authFields, jsonOptions);
request.Content = new StringContent(body, Encoding.UTF8, "application/json");
HttpResponseMessage response = await _client.SendAsync(request);
if (response != null && response.IsSuccessStatusCode)
{
Debug.WriteLine("Authenticating 3rd Party. Successful!");
return await response.Content.ReadAsStringAsync();
}
else if (response != null)
{
Debug.WriteLine("Error Authenticating 3rd Party. HttpStatusCode: " + response.StatusCode + ", message: " + response.RequestMessage);
return "Unauthorized";
}
}
catch (HttpRequestException e)
{
Debug.WriteLine("3rd Party GetAuthentication() Exception :{0} ", e.Message);
}
catch (Exception ex)
{
Debug.WriteLine("3rd Party GetAuthentication() Exception :{0} ", ex.Message);
}

return string.Empty;
}
}
}
Übersehe ich etwas in der HTTP-Client-Konfiguration? Muss ich beim Einfügen des HttpClient noch etwas tun? Oder handelt es sich lediglich um einen IDE-Fehler (ich habe diesen Code noch nicht bereitgestellt, daher habe ich keine Ahnung, dass dies außerhalb der IDE auftreten würde).
Interessant ist, dass dies nicht immer auftritt...