C# HttpClient löst zufällig eine System.NullReferenceException aus
Posted: 03 Jan 2025, 18:00
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:

Der Inhalt davon ist:
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
IPart3rdClient.cs
3rdPartClient.cs
Ü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...

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:
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);
});
Code: Select all
namespace MyApiService.Clients.Interfaces
{
public interface IParty3rdClient
{
public Task GetAuthentication(AuthFields authFields);
}
}
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;
}
}
}
Interessant ist, dass dies nicht immer auftritt...