HttpClient заблокирован и ConnectionLeaseTimeout - PullRequest
0 голосов
/ 19 декабря 2018

Я развернул приложение на .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?

...