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