API не обнаруживает заголовки

#blazor #httpclient #rest #blazor-webassembly

Вопрос:

Я работаю над своим первым приложением Blazor. Я пытаюсь запросить rest API для получения данных.

Я уже использую этот API с другими приложениями, поэтому я уверен, что он работает нормально.

Мой HTTP-запрос отклоняется моим API: API не обнаруживает заголовки, которые я хочу добавить, поэтому запрос отклоняется.

В моем 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, чтобы получить мой ограниченный httpclient :

   HttpClient httpClient;
    public ClsMetierService(HttpClient _httpClient)
    {
        httpClient = _httpClient;
 

В моем методе я вызываю свой httpclient и устанавливаю свои заголовки :

  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 JsonResu<
 

Если я установлю точку останова CheckAccessCore в своем API, AuthHeader переменная будет равна null. Я проверил incomingrequest.Headers , я получаю список из 14 заголовков, ни один из них не является «Авторизацией» или «тестом», как если бы мой заголовок не был добавлен в мой запрос:
введите описание изображения здесь

Я думал, что проблема связана с TryAddWithoutValidation методом, но мой второй заголовок «test» также не существует.

Я обычно использую 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 запроса?

Комментарии:

1. Я попробовал другой способ с помощью HttpRequestMessage: (httpRequestMessage.Headers.Add("Authorization", "loginpassword") и var response = await HttpClient.SendAsync(httpRequestMessage); все та же проблема.

Ответ №1:

Вы должны обратиться к https://docs.microsoft.com/en-us/aspnet/core/blazor/call-web-api?view=aspnetcore-5.0amp;pivots=webassembly

Правильный способ выполнения Http-запросов из приложения Blazor WebAssembly — это ввести a HttpClient , который предназначен для работы в WASM, а не стандарт HttpClient .

Чтобы добавить заголовок, обратитесь к разделу («.. с запросом Fetch API options»](https://docs.microsoft.com/en-us/aspnet/core/blazor/call-web-api?view=aspnetcore-5.0amp;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");
 

Комментарии:

1. Спасибо за ваш ответ. К сожалению, я изменил свой код, чтобы получить свой httpclient путем инъекции, но все равно столкнулся с той же проблемой. Я публикую новый код в своем вопросе, я его отредактировал.

Ответ №2:

Неважно, Blazor WASM слишком ограничен и не адаптирован для моих нужд, я должен переписать свой существующий API… Я переделал свое приложение на сервере blazor, оно работает нормально.