DelegatingHandler 中的私有变量混合来自其他请求的值

问题描述 投票:0回答:1

我们实现了一个 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 次,也许不是很频繁。

我不确定我是否目光短浅,没有看到明显或刺眼的东西。

c# .net asp.net-mvc
1个回答
3
投票

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) {
      
      
    }
}  
© www.soinside.com 2019 - 2024. All rights reserved.