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?

你应该参考https://docs.microsoft.com/en-us/aspnet/core/blazor/call-web-api?view=aspnetcore-5.0&pivots=webassembly

从 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 服务器上重新制作了我的应用程序,它工作正常。