如何最好地将异步 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>();