C#中如何在请求之间保留字段值?

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

我有以下服务:

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
字段即可使其工作。但就我而言,我不想这样做,因为每当有人登录时,我希望令牌与该用户绑定。谁能帮我解决这个问题吗?

c# asp.net controller asp.net-core-webapi field
1个回答
0
投票

作用域依赖项的行为是针对每个请求的,而不是针对每个会话的。如果您希望在每个会话的请求之间保留数据,则让您的服务访问当前的 HttpContext 并从会话状态读取/写入该值。

static
变量或静态作用域依赖项通常并不理想,因为存储的任何状态都将跨访问它的所有会话。 (在 1 个会话的测试中有效,但随后在测试/生产中引起许多问题。)

如果您使用多个 Web 服务器进行负载平衡,您将需要一个共享会话状态实现(即数据库或第 3 方会话状态管理器),因为内存中会话状态只能由对同一 Web 服务器实例的请求访问。您可以将负载平衡配置为使用粘性会话,以优先考虑对单个服务器实例对同一会话的重复请求,但如果该实例不可用,则替代实例将不会具有已保存的会话状态。

© www.soinside.com 2019 - 2024. All rights reserved.