我们实现了一个 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 次,也许不是很频繁。
我不确定我是否目光短浅,没有看到明显或刺眼的东西。
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) {
}
}