首页 > 解决方案 > 在中间件中,为什么这个值只设置一次?

问题描述

所以我正在测试一些中间件,发现是什么导致了我的问题。这是一个非常简单的解释。

例如,我有这个

public class AuthMiddleware
{
    private HttpClient _client;

    //have constructor as standard so removed to keep example short as not important

    public async Task Invoke(IHttpClientFactory clientFactory)
    {
        _client = GetClientAsync();
        await _next.Invoke(context);
    }

    private async Task<HttpClient> GetClientAsync(IHttpClientFactory clientFactory)
    {
        //NOTE: I would expect the _client to be null on every call to this method
        //However once it is created it does not get created again.
        if(_client == null)
        {
            _client = clientFactory.CreateClient("TestClient");
        }
        return _client;
    }
}

至于我的注释_client是实例变量而不是静态的,那么为什么它会在每个请求上保存一个实例而不是 null 并按预期重新创建?

标签: c#asp.net-coreasp.net-core-middleware

解决方案


(基于约定)ASP.NET Core 中的中间件在启动时创建:

中间件在每个应用程序生命周期中构造一次。

来自微软文档

因此,为所有请求保留实例字段。

如果您需要更多地控制中间件的范围,您可以使用 基于工厂的中间件


推荐阅读