C# HttpClient 返回状态 WaitingForActivation。

3

我只有以下一种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
你应该等待这些调用。 - mm8
@mm8 怎么做呢?我无法将我的构造函数(MainWindow)变成异步方法。有什么办法吗? - Izle
例如,您可以处理“Loaded”事件。请参见我的答案以获取示例。 - mm8
1个回答

7

您应该等待调用,由于这只能在异步方法中完成而不能在构造函数中完成,因此您应将您的代码移到一个方法或事件处理程序中:

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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接