如何最好地将异步 client/request 配置注入 NSwag 客户端代码
How best to inject async client/request configuration into NSwag client code
我们正在使用 NSwag 生成的网络客户端代码 API。 API 需要对所有请求设置授权 header。
这个 header 值需要从异步库方法生成(ITokenAcquisition.GetAccessTokenForUserAsync()
以防万一)。
到目前为止,我们提出的最佳选择是创建一个 class 来实现
public Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
HttpCompletionOption completionOption,
CancellationToken cancellationToken)
包装一个 HTTPClient
,这将允许我们在对包装的 HttpClient
调用 SendAsync
之前获取令牌并设置 header。然后我们可以将 class 作为 NSwag 代码使用的 HttpClient 注入。
我认为我们不能使用 NSwag 的 CreateHttpClientAsync
,因为我看不到如何将 ITokenAcquisition
(和其他依赖项)注入基础 class。 (除非客户端生成代码比我认为的更聪明)
我们错过了什么吗?
我们想出的最佳解决方案实际上最终没有使用任何 NSwag 自定义。
相反,我们添加了一个继承自 DelegatingHandler
的 class,并在那里覆盖了 SendAsync
。
然后我们将 DelegatingHandler 添加到传递给 NSwag 客户端的 HttpClient
。例如服务注册期间:
services.AddHttpClient<NSwagClientInterface, NSwagClientImplementation>((provider, client) =>
{
client.BaseAddress = new Uri(Configuration["BaseAddress"]);
})
.AddHttpMessageHandler<MyDelegatingHandler>();
我们正在使用 NSwag 生成的网络客户端代码 API。 API 需要对所有请求设置授权 header。
这个 header 值需要从异步库方法生成(ITokenAcquisition.GetAccessTokenForUserAsync()
以防万一)。
到目前为止,我们提出的最佳选择是创建一个 class 来实现
public Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
HttpCompletionOption completionOption,
CancellationToken cancellationToken)
包装一个 HTTPClient
,这将允许我们在对包装的 HttpClient
调用 SendAsync
之前获取令牌并设置 header。然后我们可以将 class 作为 NSwag 代码使用的 HttpClient 注入。
我认为我们不能使用 NSwag 的 CreateHttpClientAsync
,因为我看不到如何将 ITokenAcquisition
(和其他依赖项)注入基础 class。 (除非客户端生成代码比我认为的更聪明)
我们错过了什么吗?
我们想出的最佳解决方案实际上最终没有使用任何 NSwag 自定义。
相反,我们添加了一个继承自 DelegatingHandler
的 class,并在那里覆盖了 SendAsync
。
然后我们将 DelegatingHandler 添加到传递给 NSwag 客户端的 HttpClient
。例如服务注册期间:
services.AddHttpClient<NSwagClientInterface, NSwagClientImplementation>((provider, client) =>
{
client.BaseAddress = new Uri(Configuration["BaseAddress"]);
})
.AddHttpMessageHandler<MyDelegatingHandler>();