DelegatingHandler内部的私有变量混合了其他请求的值

时间:2019-05-28 01:16:32

标签: c# .net asp.net-mvc

我们实现了一个DelegatingHandler,其中包含一些私有变量,其中有两个是从不同的并行请求中获取的值,而不是它们本身不是静态变量

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 个答案:

答案 0 :(得分:0)

应用程序收到的所有请求同时消耗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) {


    }
}