Закрытые переменные внутри DelegatingHandler, смешивающие значения из других запросов - PullRequest
1 голос
/ 28 мая 2019

У нас реализован DelegatingHandler, в котором есть несколько закрытых переменных, и 2 из них получают значения из разных параллельных запросов, отличных от их собственных, даже если они не являются статическими переменными

public sealed class XYZProxyHandler:DelegatingHandler
{
    private string _var1;
    private string _var2;

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var token = request.Headers.GetCookies().FirstOrDefault().Cookies.FirstOrDefault(x => x.Name.ToLower() == "access_token").Value;
        _var1 = GetVar1(token);
        _var2 = GetVar2(token);

Пытался сделать его простымкод, в том числе важный кусок кода.В приведенном выше примере кода в идеале _var1 и _var2 должны получать значения своего собственного запроса, но по какой-то причине они иногда получают значения других запросов.У меня есть случаи, когда _var1 получает значение другого запроса, но _var2 получает значение своего собственного запроса, и наоборот.

Я сталкивался с таким типом поведения раньше, когда статическая переменная совместно используется запросами, но этине являются статическими переменными, и поэтому я не уверен, как это может произойти или что-то связано с реализацией DelegatingHandler.

Я пытался проверить это, но не воспроизводил его, и я работаю над тем же с болееизменения тестовых данных, и это происходит 50 раз в месяц, может быть, не так часто.

Я не уверен, что мне видят туннель и я не вижу ничего очевидного или явного.

1 Ответ

1 голос
/ 28 мая 2019

Экземпляр класса DelegatingHandler одновременно используется всеми запросами, которые получает приложение, поэтому такое поведение предсказуемо.

Я бы избавился от любых локальных переменных и передал бы необходимые значения напрямую:

public sealed class XYZProxyHandler : DelegatingHandler
{
   // If needed some thread-safe service, repo, etc can be passed in the constructor.
    /*
    private readonly ISmth _smth;

    public XYZProxyHandler(ISmth smth) 
    {
        _smth = smth;
    }
    */

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var token = request.Headers.GetCookies().FirstOrDefault().Cookies.FirstOrDefault(x => x.Name.ToLower() == "access_token").Value;
        var _var1 = GetVar1(token);
        var _var2 = GetVar2(token);

        SomeMethod(_var1, _var2);

        // ..
    }

    private void SomeMethod(string one, string two) {


    }
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...