C# HttpClient возвращает статус WaitingForActivation - PullRequest
3 голосов
/ 21 апреля 2020

У меня есть только один метод для запроса API, как следует

private async Task<Site> getSiteAsync(string siteId)
{
    Site site = null;
    var response = await httpClient.SendAsync( 
        new HttpRequestMessage(HttpMethod.Get, httpClient.BaseAddress + $"api/sites/{siteId}"));
    if (response.IsSuccessStatusCode)
    {
        var stream = await response.Content.ReadAsStreamAsync();
        site = await JsonSerializer.DeserializeAsync<Site>(stream, serializerOptions);
    }
    return site;
}

Когда я пытаюсь вызвать его из моего MainClass, первый вызов (a) работает нормально, но b, c и d они все возвращают мне Status = WaitingForActivation.

private readonly HttpClient httpClient = new HttpClient();
private readonly JsonSerializerOptions serializerOptions = new JsonSerializerOptions();

public MainWindow()
{
    httpClient.BaseAddress = new Uri($"http://localhost:5000/MyApi/");
    httpClient.DefaultRequestHeaders.Accept.Clear();
    httpClient.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));
    serializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;

    var a = getSiteAsync("0001"); << I only get the value of this call.
    var b = getSiteAsync("0002");
    var c = getSiteAsync("0003");
    var d = getSiteAsync("0004");
    InitializeComponent(); 
}

Как я могу получить Результат b, c и d?

1 Ответ

7 голосов
/ 21 апреля 2020

Вы должны ждать вызовов и, поскольку вы можете сделать это только в методе async, а не в конструкторе, вам следует переместить свой код в метод или обработчик события:

public MainWindow()
{
    httpClient.BaseAddress = new Uri($"http://localhost:5000/MyApi/");
    httpClient.DefaultRequestHeaders.Accept.Clear();
    httpClient.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));
    serializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;

    Loaded += async (s, e) =>
    {
        var a = await getSiteAsync("0001");
        var b = await getSiteAsync("0002");
        var c = await getSiteAsync("0003");
        var d = await getSiteAsync("0004");
    };

    InitializeComponent();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...