我们实现了一个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次,也许不是那么频繁。
我不确定我是否被视线洞见,看不到明显或刺眼的东西。
答案 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) {
}
}