Вызов GetAsync в Blazor WebAssembly завершается с ошибкойC#

Место общения программистов C#
Ответить
Anonymous
 Вызов GetAsync в Blazor WebAssembly завершается с ошибкой

Сообщение Anonymous »

Я считаю, что здесь происходит нечто, чего я не понимаю в Blazor, возникшем в результате разработки Windows Forms. Я пытаюсь получить данные из API, который, как я знаю, работает и правильно доставляет данные в другое приложение. Мне кажется, что код завершается до завершения асинхронного вызова.
Он аварийно завершился на строке httpClient.GetAsync. В целях тестирования этот вызов выполняется, когда страница загружается с помощью функции OnInitializedAsync.
Я следовал двум разным руководствам, но оба дают один и тот же результат, что и .GetAsync Ошибка вызова: https://code-maze.com/blazor-webassembly-httpclient/ и
Пожалуйста. Помогите.
Спасибо!
Класс обслуживания:

Код: Выделить всё

public class RecipeService : IRecipeService
{
private readonly HttpClient httpClient;

private string baseURL = clConstants.SERVER_PATH;
private string apiEndPoint = "getRecipeByID/";

public RecipeService(HttpClient httpClient)
{
this.httpClient = httpClient;
}

async Task IRecipeService.getRecipeByID(int id)
{
ConfigureHTTPClient();

string URL = clConstants.SERVER_PATH + apiEndPoint + id.ToString();

// Crashes on this line of code
var res = httpClient.GetAsync(URL).Result;
}
}
Интерфейс:

Код: Выделить всё

public interface IRecipeService
{
//Task getRecipeByID(int id);
Task getRecipeByID(int id);
}
Функция на странице Razor:

Код: Выделить всё

protected override async Task OnInitializedAsync()
{
recipe = await RecipeService.getRecipeByID(currentCount);
}

Код: Выделить всё

Program.cs
(добавлена ​​следующая строка):

Код: Выделить всё

builder.Services.AddScoped();
ОБНОВЛЕННЫЙ КОД
Интерфейс

Код: Выделить всё

public class RecipeService : IRecipeService
{
private readonly string apiEndPoint = "GetRecipeByID/";

private readonly IHttpClientFactory httpClientFactory;
private HttpClient CreateHttpClient() => httpClientFactory.CreateClient("MainApi");

private readonly JsonSerializerOptions jsonOptions = new()
{
PropertyNameCaseInsensitive = true
};

public RecipeService(IHttpClientFactory httpClientFactory)
{
this.httpClientFactory = httpClientFactory;
}

public async TaskgetRecipeByID(int id)
{
string URL = apiEndPoint + id.ToString();

var response = await CreateHttpClient().GetAsync(URL, HttpCompletionOption.ResponseHeadersRead);
var result = await response.Content.ReadAsStreamAsync();

var recipe = await JsonSerializer.DeserializeAsync(result, jsonOptions);
return recipe;

}
}

public interface IRecipeService
{
Task getRecipeByID(int id);
}
Программа

Код: Выделить всё

builder.Services.AddHttpClient("MainApi", options =>
{
options.BaseAddress = new Uri(clConstants.SERVER_PATH);
});

builder.Services.AddSingleton();
СТРАНИЦА

Код: Выделить всё

@inject IRecipeService RecipeService

private List recipe { get; set; }

public interface IRecipeService
{
Task getRecipeByID(int id);
}
Ошибка в браузере:

Код: Выделить всё

has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled
У меня есть API с WCF (думаю, он был написан десять лет назад). Похоже, мне нужно реализовать CORS на стороне сервера. Как лучше всего это сделать? Написать новый API с нуля?

Подробнее здесь: https://stackoverflow.com/questions/793 ... mbly-fails
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»