C# HttpClient случайным образом выдает System.NullReferenceExceptionC#

Место общения программистов C#
Ответить
Anonymous
 C# HttpClient случайным образом выдает System.NullReferenceException

Сообщение Anonymous »

Я пытаюсь позвонить третьей стороне, чтобы получить строку аутентификации, чтобы я мог выполнить дополнительный вызов, но иногда получаю следующее сообщение об ошибке:
Изображение

Содержимое которого:

Код: Выделить всё

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:
Это кажется случайным, и это также происходит в других вызовах HttpClient, которые я делаю. Я внедряю HTTPClient и задаюсь вопросом, возможно, я делаю это неправильно (довольно новое для C#).
Вот как выглядит код (имена были изменены для защиты невиновных):
Program.cs

Код: Выделить всё

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

Код: Выделить всё

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

Код: Выделить всё

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;
}
}
}
Код, который его вызывает:

Код: Выделить всё

        // Going forward might want to make the auth token cached, so we can skip extra calls
if (string.IsNullOrEmpty(Authentication))
Authentication = await GetAuthentication(new AuthFields("Something", "More"));
if (!string.IsNullOrEmpty(Authentication) && Authentication != "Unauthorized")
{
Я что-то упустил в конфигурации HTTP-клиента? Нужно ли мне делать что-то еще при внедрении HttpClient? Или это просто ошибка IDE (я еще не развернул этот код, поэтому понятия не имею, что это произойдет за пределами IDE).
Интересно то, что это происходит не всегда...

Подробнее здесь: https://stackoverflow.com/questions/793 ... eexception
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»