如何最好地将异步客户端/请求配置注入 NSwag 客户端代码

时间:2021-02-25 10:13:48

标签: c# nswag

我们将 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(和其他依赖项)注入基类。 (除非客户端生成代码比我认为的更聪明)

我们错过了什么吗?

1 个答案:

答案 0 :(得分:0)

我们提出的最佳解决方案最终实际上并未使用任何 NSwag 自定义。

相反,我们添加了一个继承自 DelegatingHandler 的类并在那里覆盖了 SendAsync

然后我们将我们的 DelegatingHandler 添加到传递给 NSwag 客户端的 HttpClient。例如服务注册期间:

    services.AddHttpClient<NSwagClientInterface, NSwagClientImplementation>((provider, client) =>
        {
            client.BaseAddress = new Uri(Configuration["BaseAddress"]);
        })
        .AddHttpMessageHandler<MyDelegatingHandler>();