【发布时间】:2020-07-08 13:28:48
【问题描述】:
我正在构建一个供内部使用的小型库,它依赖 Flurl 来处理所有传出的 HTTP 调用。
我想为这个库的使用者提供选择加入我们的 HTTP 调用跟踪基础设施的能力,如下所示:
Startup.cs:
...
public void ConfigureServices(IServiceCollection services)
{
....
services.AddTracing(options => ...);
....
}
...
我当前的AddTracing() 实现如下所示:
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddTracing(this IServiceCollection services, Action<TracingOptions> configureOptions)
{
var tracingOptions = new TracingOptions();
configureOptions(tracingOptions);
// Make these options available in DI container
services.AddSingleton(tracingOptions);
FlurlHttp.Configure(settings =>
{
settings.HttpClientFactory = new TracingHttpClientFactory(tracingOptions.ApplicationName);
});
return services;
}
}
TracingHttpClientFactory 的当前实现如下所示:
public class TracingHttpClientFactory : DefaultHttpClientFactory
{
private readonly string _applicationName;
public TracingHttpClientFactory(string applicationName)
{
_applicationName = applicationName;
}
// override to customize how HttpMessageHandler is created/configured
public override HttpMessageHandler CreateMessageHandler()
{
var tracingHandler = new TracingHandler(_applicationName, base.CreateMessageHandler());
return tracingHandler;
}
}
这可行,但我面临的问题是Configure() 的文档显示:只应在应用程序启动时调用一次。
因此,我通过添加跟踪(这是可选的)“浪费了”我对Configure() 的调用。在使用tracing的场景下,我之后还需要调用Configure()。
我可能需要在之后调用 configure 的一个示例是在 Startup.cs 中:
...
public void ConfigureServices(IServiceCollection services)
{
....
// Configure() is being called inside AddTracing()
services.AddTracing(options => ...);
....
// This is a second call to Configure()
FlurlHttp.Configure(settings => {
var jsonSettings = new JsonSerializerSettings
{
ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor
};
settings.JsonSerializer = new NewtonsoftJsonSerializer(jsonSettings);
});
}
...
重点是——AddTracing() 的每个消费者都应该能够按照他们认为合适的方式配置 Flurl。 AddTracing() 的重点是简单地为 Flurl “增压”一些额外的可选功能。它并不是要接管 Configure() - 它是为了扩展它。
我一直在阅读文档here,尽管有很多地方可以进行配置,但我无法找到获得我的TracingHandler(这是一个HttpMessageHander)的方法无需在某处调用 Configure() 即可处理每个请求。
是否有适合我描述的场景的实现?
【问题讨论】:
-
"在使用tracing的场景下,我之后还需要调用Configure()。"为什么?你能详细说明那部分吗?
-
我已进行了编辑并添加了额外说明
标签: c# asp.net-core flurl