我創建了一個簡單的 asp.net Web API,它從 SQL 表中發送用戶。該 API 需要在請求標頭中有一個密鑰。我現在正在創建一個簡單的 Blazor WebAssembly 應用程式來顯示用戶。我只是添加一個簡單的httpclient:
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri("https://localhost:7280/")});
然后我創建了典型的 crud 操作。例如對所有用戶的請求:
public class UserService : IUserService
{
private readonly HttpClient httpClient;
public UserService(HttpClient httpClient)
{
this.httpClient = httpClient;
}
public async Task<List<UserDto>> GetUsers()
{
try
{
var response = await this.httpClient.GetAsync("api/Users");
if (response.IsSuccessStatusCode)
{
if (response.StatusCode == System.Net.HttpStatusCode.NoContent)
{
return Enumerable.Empty<UserDto>().ToList();
}
return await response.Content.ReadFromJsonAsync<List<UserDto>>();
}
else
{
var alert = await response.Content.ReadAsStringAsync();
throw new Exception($"Http status:{response.StatusCode} - {alert}");
}
}
catch (Exception)
{
throw;
}
}
}
有沒有辦法為所有請求添加標頭?還是我每次都必須提出自定義請求?
uj5u.com熱心網友回復:
為所有 HTTP 請求添加行為的標準模式是使用DelegatingHandler. 為了您的目的,首先創建一個類:
public class AddHeadersDelegatingHandler : DelegatingHandler
{
public AddHeadersDelegatingHandler() : base(new HttpClientHandler())
{
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
request.Headers.Add("X-MyTestHeader", "MyValue"); // Add whatever headers you want here
return base.SendAsync(request, cancellationToken);
}
}
然后只需更改您現有的注冊:
builder.Services.AddScoped(sp => new HttpClient
{
BaseAddress = new Uri("https://localhost:7280/")
});
至:
builder.Services.AddScoped(sp => new HttpClient(new AddHeadersDelegatingHandler())
{
BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)
});
需要注意的有趣點:
- 請為您提供一個建構式,
DelegatingHandler并將HttpClientHandler. 如果您錯過了這一步,您將收到一個運行時錯誤,即委托處理程式尚未分配目標。 SendAsync可以是異步方法。在這種特殊情況下,因為它不等待任何東西,所以它不是。- 您可以繼續使用
new Uri("https://localhost:7280/"),但builder.HostEnvironment.BaseAddress通常是首選。 - 自然地,要對回應做任何事情,您應該使方法異步、等待
base.SendAsync(它為您提供回應),然后按照您的意愿使用它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/496138.html
