#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, оно работает нормально.