相关疑难解决方法(0)

HttpClient DelegatingHandler意外的生命周期

在ASP.NET Core 2.1应用中,我正在使用进行REST请求HttpClient。我正在使用DelegatingHandlers定义一些常见的行为。我在这里注册:

private static void AddRestServiceDataClient<TTypedHttpClient, TTypedHttpClientImpl>(this IServiceCollection services)
    where TTypedHttpClient : class
    where TTypedHttpClientImpl : RestServiceDataClient, TTypedHttpClient
{
    var httpClientBuilder = services
        .AddHttpClient<TTypedHttpClient, TTypedHttpClientImpl>()
        .AddHttpMessageHandler<CachingHttpDelegatingHandler>()
        .AddHttpMessageHandler<ExceptionHttpDelegatingHandler>()
        .AddHttpMessageHandler<LoggingHttpDelegatingHandler>();
}

...

// EDIT: You should always register DelegatingHandlers as TRANSIENT (read answer for more).
services.AddScoped<ExceptionHttpDelegatingHandler>();
services.AddScoped<CachingHttpDelegatingHandler>();
services.AddScoped<LoggingHttpDelegatingHandler>();
Run Code Online (Sandbox Code Playgroud)

我将DelegatingHandlers 注册为Scoped,但是在两个不同的范围(请求)中,我得到相同的DelegatingHandler。我的意思是,的构造函数DelegationgHandler仅被调用一次,并且在更多请求(例如单例)中使用同一实例。其他所有事情都符合预期-其他服务,TypedHttpClients和HttpClient的生命周期都可以。

我在构造函数中按断点测试了所有内容,并且在每个实例中都测试了Guid,以便区分实例。

当我将DelegatingHandlers 注册为Transient时,它没有任何区别。

TL; DR DelegatingHandler像单例一样被解析,即使它们已注册为作用域。这使我沉迷于服务型生活方式。

.net dependency-injection dotnet-httpclient .net-core asp.net-core

8
推荐指数
2
解决办法
1272
查看次数