如何根据请求 header 调用需要不记名令牌的 NSwag 客户端方法?
How to invoke a NSwag client method that needs bearer token on request header?
我不明白 NSwag 如何与 IdentityServerX 不记名令牌交互并按常规添加请求 header?据我所知,我的主机 api 应用程序使用 LDAP 身份验证实现了 IdentityServer3;如果任何主机需要令牌进行身份验证,则任何客户端都必须根据请求发送令牌 header。那么在 NSwag 客户端工作时我该如何处理呢?
任何想法表示赞赏。
谢谢
我已经通过部分方法解决了这个问题。
我的例子是:
CampaignClient.cs
public partial class CampaignClient
{
partial void PrepareRequest(HttpClient request, ref string url);
partial void ProcessResponse(HttpClient request, HttpResponseMessage response);
//some codes...
}
CampaignClient.Extensions.cs - 部分 class:
public partial class CampaignClient
{
private readonly IRequestContext _requestContext;
private readonly IStartupConfiguration _startupConfiguration;
public CampaignClient(IRequestContext requestContext, IStartupConfiguration startupConfiguration)
{
_requestContext = requestContext;
_startupConfiguration = startupConfiguration;
}
partial void PrepareRequest(HttpClient request, ref string url)
{
request.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _requestContext.GetBearerTokenOrTriggerUnauthException());
}
}
方法覆盖救了我!
对于 c# 客户端,您可以指定
UseHttpClientCreationMethod
或UseHttpRequestMessageCreationMethod
这样 NSwag 希望您实现创建 HttpClient 或 HttpRequest 的方法。你可以在那里设置你的headers而不需要任何魔法
@oguzhan-soykan 和@peter 的回答都很好——这是对@peter 回答的扩展,展示了如何实现基础 class 而不是为每个 API 客户重复自己。
要求
- NSwag.MSBuild 包裹
- Swagger
.JSON
定义
创建一个公开您需要的功能的基础 'Client' class。可能是不记名令牌 属性.
public abstract class MySwaggerClientBase
{
public string BearerToken { get; private set; }
public void SetBearerToken(string token)
{
BearerToken = token;
}
// Called by implementing swagger client classes
protected Task<HttpRequestMessage> CreateHttpRequestMessageAsync(CancellationToken cancellationToken)
{
var msg = new HttpRequestMessage();
// SET THE BEARER AUTH TOKEN
msg.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", BearerToken);
return Task.FromResult(msg);
}
}
编辑您的 swagger 代码生成命令,为所有生成的客户端使用基础 class,并使用 UseHttpRequestMessageCreationMethod 选项。
<Project>
...
<Exec Command="$(NSwagExe) swagger2csclient /input:path-to-swagger-definition.json /output:$(ProjectDir)\Swagger.generated.cs /Namespace:MyNameSpace /ClientBaseClass:MySwaggerClientBase /UseHttpRequestMessageCreationMethod:true" />
...
</Project>
我不明白 NSwag 如何与 IdentityServerX 不记名令牌交互并按常规添加请求 header?据我所知,我的主机 api 应用程序使用 LDAP 身份验证实现了 IdentityServer3;如果任何主机需要令牌进行身份验证,则任何客户端都必须根据请求发送令牌 header。那么在 NSwag 客户端工作时我该如何处理呢?
任何想法表示赞赏。 谢谢
我已经通过部分方法解决了这个问题。 我的例子是:
CampaignClient.cs
public partial class CampaignClient
{
partial void PrepareRequest(HttpClient request, ref string url);
partial void ProcessResponse(HttpClient request, HttpResponseMessage response);
//some codes...
}
CampaignClient.Extensions.cs - 部分 class:
public partial class CampaignClient
{
private readonly IRequestContext _requestContext;
private readonly IStartupConfiguration _startupConfiguration;
public CampaignClient(IRequestContext requestContext, IStartupConfiguration startupConfiguration)
{
_requestContext = requestContext;
_startupConfiguration = startupConfiguration;
}
partial void PrepareRequest(HttpClient request, ref string url)
{
request.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _requestContext.GetBearerTokenOrTriggerUnauthException());
}
}
方法覆盖救了我!
对于 c# 客户端,您可以指定
UseHttpClientCreationMethod
或UseHttpRequestMessageCreationMethod
这样 NSwag 希望您实现创建 HttpClient 或 HttpRequest 的方法。你可以在那里设置你的headers而不需要任何魔法
@oguzhan-soykan 和@peter 的回答都很好——这是对@peter 回答的扩展,展示了如何实现基础 class 而不是为每个 API 客户重复自己。
要求
- NSwag.MSBuild 包裹
- Swagger
.JSON
定义
创建一个公开您需要的功能的基础 'Client' class。可能是不记名令牌 属性.
public abstract class MySwaggerClientBase
{
public string BearerToken { get; private set; }
public void SetBearerToken(string token)
{
BearerToken = token;
}
// Called by implementing swagger client classes
protected Task<HttpRequestMessage> CreateHttpRequestMessageAsync(CancellationToken cancellationToken)
{
var msg = new HttpRequestMessage();
// SET THE BEARER AUTH TOKEN
msg.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", BearerToken);
return Task.FromResult(msg);
}
}
编辑您的 swagger 代码生成命令,为所有生成的客户端使用基础 class,并使用 UseHttpRequestMessageCreationMethod 选项。
<Project>
...
<Exec Command="$(NSwagExe) swagger2csclient /input:path-to-swagger-definition.json /output:$(ProjectDir)\Swagger.generated.cs /Namespace:MyNameSpace /ClientBaseClass:MySwaggerClientBase /UseHttpRequestMessageCreationMethod:true" />
...
</Project>