首页 > 解决方案 > C# HttpClient 返回状态 WaitingForActivation

问题描述

我只有一种 Api Request 方法如下

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 的结果?

标签: c#wpf.net-coreasync-awaitasp.net-core-webapi

解决方案


您应该等待调用,因为您只能在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();
}

推荐阅读