API 未检测到 headers
API does not detect the headers
我正在开发我的第一个 Blazor 应用程序。我尝试请求休息 API 以获取数据。
我已经将此 API 与其他应用程序一起使用,所以我确信它工作正常。
我的 HTTP 请求被我的 API 拒绝了:API 没有检测到我要添加的 header,所以请求被拒绝了。
在我的 API 中,我检查了我的用户名和密码:
protected override bool CheckAccessCore(OperationContext operationContext)
{
string AuthHeader = WebOperationContext.Current.IncomingRequest.Headers["Authorization"];
if(!string.IsNullOrWhiteSpace(AuthHeader))
{
return CheckCredentials(AuthHeader);
}
return false;
}
此代码适用于其他应用程序。
在我的 Blazor 项目中,我这样调用我的 API :
在Program.cs中,我声明我的Httpclient:
builder.Services.AddScoped(sp => new HttpClient{BaseAddress = new Uri("https://localhost:44346/MyServiceRest.svc")});
builder.Services.AddScoped<ProjectModel.ClsMetierService>();
我在我的 ClsMetierService class 中添加了一个构造函数来获取我的作用域 httpclient :
HttpClient httpClient;
public ClsMetierService(HttpClient _httpClient)
{
httpClient = _httpClient;
在我的方法中,我调用我的 httpclient 并设置我的 headers :
var requestMessage = new HttpRequestMessage()
{
Method = new HttpMethod("GET"),
RequestUri = new Uri(urlStream)
};
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Authorization", System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("Admin:Password")));
requestMessage.Content.Headers.TryAddWithoutValidation("Test", "Value");
var response = await httpClient.SendAsync(requestMessage);
var responseStatusCode = response.StatusCode;
JsonResult = await response.Content.ReadAsStringAsync();
return JsonResult;
如果我在 API 中的 CheckAccessCore
中设置断点,则 AuthHeader
变量为空。我检查了 incomingrequest.Headers
,我得到了 14 个 header 的列表,其中 none 是“授权”或“测试”,好像我的 header 没有添加到我的请求:
我以为问题是因为TryAddWithoutValidation
方法,但我的第二个header“测试”也不存在。
我通常使用 HttpWebRequest 并以这种方式:
httpReq.Headers.Add("Authorization", System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("login:password")));
但是使用 Blazor WebAssembly 我得到这个错误:System.Net.Request is not supported on this platform
如何为我的 HttpClient
请求设置自定义 header?
从 Blazor WebAssembly 应用程序发出 Http 请求的正确方法是注入一个 HttpClient
,它是为在 WASM 中工作而设计的,而不是标准的 HttpClient
。
要添加 header,请参阅部分(".. with Fetch API 请求选项"](https://docs.microsoft.com/en-us/aspnet/core/blazor/call-web-api?view=aspnetcore-5.0&pivots=webassembly#httpclient-and-httprequestmessage-with-fetch-api-request-options-1)
requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", token.Value);
requestMessage.Content.Headers.TryAddWithoutValidation(
"x-custom-header", "value");
没关系,Blazor WASM 太有限且不适合我的需要,我必须重写我现有的 API...我在 blazor 服务器上重新制作了我的应用程序,它工作正常。
我正在开发我的第一个 Blazor 应用程序。我尝试请求休息 API 以获取数据。
我已经将此 API 与其他应用程序一起使用,所以我确信它工作正常。
我的 HTTP 请求被我的 API 拒绝了:API 没有检测到我要添加的 header,所以请求被拒绝了。
在我的 API 中,我检查了我的用户名和密码:
protected override bool CheckAccessCore(OperationContext operationContext)
{
string AuthHeader = WebOperationContext.Current.IncomingRequest.Headers["Authorization"];
if(!string.IsNullOrWhiteSpace(AuthHeader))
{
return CheckCredentials(AuthHeader);
}
return false;
}
此代码适用于其他应用程序。
在我的 Blazor 项目中,我这样调用我的 API :
在Program.cs中,我声明我的Httpclient:
builder.Services.AddScoped(sp => new HttpClient{BaseAddress = new Uri("https://localhost:44346/MyServiceRest.svc")});
builder.Services.AddScoped<ProjectModel.ClsMetierService>();
我在我的 ClsMetierService class 中添加了一个构造函数来获取我的作用域 httpclient :
HttpClient httpClient;
public ClsMetierService(HttpClient _httpClient)
{
httpClient = _httpClient;
在我的方法中,我调用我的 httpclient 并设置我的 headers :
var requestMessage = new HttpRequestMessage()
{
Method = new HttpMethod("GET"),
RequestUri = new Uri(urlStream)
};
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Authorization", System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("Admin:Password")));
requestMessage.Content.Headers.TryAddWithoutValidation("Test", "Value");
var response = await httpClient.SendAsync(requestMessage);
var responseStatusCode = response.StatusCode;
JsonResult = await response.Content.ReadAsStringAsync();
return JsonResult;
如果我在 API 中的 CheckAccessCore
中设置断点,则 AuthHeader
变量为空。我检查了 incomingrequest.Headers
,我得到了 14 个 header 的列表,其中 none 是“授权”或“测试”,好像我的 header 没有添加到我的请求:
我以为问题是因为TryAddWithoutValidation
方法,但我的第二个header“测试”也不存在。
我通常使用 HttpWebRequest 并以这种方式:
httpReq.Headers.Add("Authorization", System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("login:password")));
但是使用 Blazor WebAssembly 我得到这个错误:System.Net.Request is not supported on this platform
如何为我的 HttpClient
请求设置自定义 header?
从 Blazor WebAssembly 应用程序发出 Http 请求的正确方法是注入一个 HttpClient
,它是为在 WASM 中工作而设计的,而不是标准的 HttpClient
。
要添加 header,请参阅部分(".. with Fetch API 请求选项"](https://docs.microsoft.com/en-us/aspnet/core/blazor/call-web-api?view=aspnetcore-5.0&pivots=webassembly#httpclient-and-httprequestmessage-with-fetch-api-request-options-1)
requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", token.Value);
requestMessage.Content.Headers.TryAddWithoutValidation(
"x-custom-header", "value");
没关系,Blazor WASM 太有限且不适合我的需要,我必须重写我现有的 API...我在 blazor 服务器上重新制作了我的应用程序,它工作正常。