Я развернул приложение на .NET Core 2.2 с некоторыми веб-файлами;приложение Dockerized на компьютере CentOs.Он хорошо работает и работает с довольно большим трафиком.
Контроллер находится под атрибутом Authorization, введенным промежуточным ПО аутентификации;промежуточное ПО проверяет систему аутентификации, используя POST.Httpclient - это синглтон внутри самого промежуточного программного обеспечения.
Startup.cs
services.AddAuthentication()
.AddTokenAuth(auth =>
{
auth.ServiceUrl = new Uri(Configuration["authUrl"]);
auth.AllowCryptoString = true;
auth.TokenCache = new Microsoft.Extensions.Caching.Memory.MemoryCache(new Microsoft.Extensions.Caching.Memory.MemoryCacheOptions());
auth.CacheExpiration = TimeSpan.FromMinutes(15);
});
MyFancyController.cs
[Authorize(AuthenticationSchemes = TokenAuthDefaults.AuthenticationScheme)]
[ApiVersion("1.0")]
public class MyFancyController : Controller
AuthenticationProxy.cs
public class AuthenticationProxy
{
private static HttpClient _clientInstance;
private static HttpClient _backchannel
{
get
{
if (_clientInstance == null)
_clientInstance = new HttpClient();
return _clientInstance;
}
}
public AuthenticationProxy(string serviceUrl)
{
_serviceUrl = new Uri(serviceUrl);
}
public async Task<out> GetUserDataAsync(string token)
{
Dictionary<string, string> formData = new Dictionary<string, string>
{
{ "keyedInfo", "..." },
{ "tokenData", token }
};
FormUrlEncodedContent content = new FormUrlEncodedContent(formData);
var response = await _backchannel.PostAsync(new Uri(_serviceUrl, _getUserDataEndpoint), content);
string stringContent = await response.Content.ReadAsStringAsync();
[...]
}
}
Но ... иногда случается, чтоPOST при запуске системы аутентификации и никогда не заканчивается, потому что ConnectionLeaseTimeout
по умолчанию - Бесконечно (!!);поэтому поток заблокирован, и чем больше вызовов происходит в этой проблеме, тем больше зависает система из-за огромного использования процессора (99%).
Что может вызвать эту проблему?Может быть проблема обновления DNS внутри контейнера докера, как сообщается здесь https://github.com/dotnet/corefx/issues/11224? Или что-то связанное с Docker, но я не могу найти никакого документа по этому вопросу.
Я хочу заменить свой httpclient singleton как можно скорее вЧтобы использовать httpclientfactory
https://docs.microsoft.com/it-it/dotnet/standard/microservices-architecture/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests
Но есть и вторая проблема с HttpClient, которая может возникнуть при использовании его в качестве одиночного или статического объекта.В этом случае одноэлементный или статический HttpClient не учитывает изменения DNS, как объясняется в этом выпуске репозитория .NET Core GitHub.
Может ли это решить проблему?В любом случае лучше установить ConnectionLeaseTimeout?