我有以下服务:
public class MyService: IMyService
{
private string myToken;
public MyService()
{
}
public void SetMyToken(string token)
{
Console.WriteLine($"This is the parameter token: {token}");
myToken = token;
Console.WriteLine($"This is myToken: {myToken}");
}
public async Task<string> TriggerPipeline()
{
Console.WriteLine($"Calling TriggerPipeline function. myToken: {myToken}");
// the rest of the code
}
}
我有以下控制器:
[Route("[controller]")]
[ApiController]
public class MyController: ControllerBase
{
private readonly IMyService _myService;
public MyController(IMyService myService,)
{
_myService = myService;
}
[HttpGet("set-token")]
public async Task<IActionResult> SetToken(string token)
{
_myService.SetMyToken(token);
return Ok("Token set successfully");
}
[HttpPost("trigger-pipeline")]
public async Task<IActionResult> TriggerPipeline()
{
// the rest of the code
}
}
在控制器中,当我调用
SetToken
端点并传入 "123"
,然后调用 TriggerPipeline
端点时,我在控制台上得到:
This is the parameter token: 123
This is myToken: 123
Calling TriggerPipeline function. myToken:
如您所见,在
SetToken
上进行一次 Http 调用后,我能够保留令牌值 ("123"
)。然而,在 TriggerPipeline
上再次进行 Http 调用后,我不再保留该令牌。
在我的
Program.cs
中,我已经在使用范围服务:
builder.Services.AddScoped<IMyService, MyService>();
我只需将
myToken
设为 static
字段即可使其工作。但就我而言,我不想这样做,因为每当有人登录时,我希望令牌与该用户绑定。谁能帮我解决这个问题吗?
作用域依赖项的行为是针对每个请求的,而不是针对每个会话的。如果您希望在每个会话的请求之间保留数据,则让您的服务访问当前的 HttpContext 并从会话状态读取/写入该值。
static
变量或静态作用域依赖项通常并不理想,因为存储的任何状态都将跨访问它的所有会话。 (在 1 个会话的测试中有效,但随后在测试/生产中引起许多问题。)
如果您使用多个 Web 服务器进行负载平衡,您将需要一个共享会话状态实现(即数据库或第 3 方会话状态管理器),因为内存中会话状态只能由对同一 Web 服务器实例的请求访问。您可以将负载平衡配置为使用粘性会话,以优先考虑对单个服务器实例对同一会话的重复请求,但如果该实例不可用,则替代实例将不会具有已保存的会话状态。