我正在一个MVC5 ASP.NET项目中工作,并且了解到要从控制器向WEB API发送经过身份验证的请求,我可以执行以下操作向标头添加令牌(使用示例代码):
public static class APICaller
{
// Use a single instance for HttpClient to reduce overhead
private static readonly HttpClient client = new HttpClient();
//Set the Authorization Header
public static string SetHeader( string token )
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
return("Success");
}
}
Run Code Online (Sandbox Code Playgroud)
是否在HttpClient线程安全上以这种方式设置标头?假设此HttpClient仅存在一个实例,其他用户是否将有一种访问该令牌的方式?
编辑:
我想再问一个问题,以更好地了解它的工作原理。每次使用相同的HttpClient对象发出请求时,都需要添加标头吗?
使用这种方法,在静态实例上设置默认请求标头后,它将保持设置状态,而无需继续设置它。这意味着,如果有多个请求进入您的服务器,则可能会遇到这样的情况,即为一个用户设置了标头,然后在另一个请求发出该请求之前,另一个请求又更改了该标头。
一种避免这种情况的选择是SendAsync在使用用户特定的授权标头时使用。这使您可以将标题绑定到特定的消息,而不是将其设置为HttpClient自身的默认值。
该代码有点冗长,但是看起来像这样:
using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "http://path/to/wherever"))
{
httpRequestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "TheToken");
using (var httpResponseMessage = httpClient.SendAsync(httpRequestMessage))
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,标头是在每个请求上专门设置的,因此混淆了标头。明显的缺点是此语法更冗长。
| 归档时间: |
|
| 查看次数: |
1105 次 |
| 最近记录: |