【问题标题】:ASP.Net 4.6 Task await not returningASP.Net 4.6 任务等待不返回
【发布时间】:2021-03-25 17:35:43
【问题描述】:

我正在制作一个基本的 POST 以从 API 接收身份验证令牌。 我的代码通过按下按钮启动任务。

Task<DataClass.AuthenticationToken> token = GetAuthTokenAsync(tbUsername.Text.Trim(), tbPassword.Text.Trim());

任务应该在“dataclass”中定义的数据结构中返回我的令牌信息

private async Task<DataClass.AuthenticationToken> GetAuthTokenAsync(string username, string password)
{
    string requestURL = DataClass.CloudAPIBaseURL + DataClass.CloudTokenURL;
    HttpClient client = new HttpClient();
    HttpResponseMessage response = new HttpResponseMessage();
    DataClass.AuthenticationRequest request = new DataClass.AuthenticationRequest
    {
        username = username,
        password = password
    };

    DataClass.AuthenticationToken token = new DataClass.AuthenticationToken();

    // Post request
    response = await client.PostAsJsonAsync(requestURL, request);

    //never gets here!!!
    // I will complete coding once I get the response.

    //string statusCode = response.StatusCode.ToString();
    return token;
}

使用 Fiddler,我看到我的 POST 发出,并且响应包含正确的授权数据。 由于某种原因,异步等待没有返回。

【问题讨论】:

  • 您是否了解client.PostAsJsonAsync(requestURL, request) 所击中的内容?如果它是你的,你需要调试它,看看为什么它永远不会返回。您的 await 只是在完成它的工作并等待它完成。
  • 您是否尝试将 HttpClient 的 Timeout 设置为 1 或 2 秒(default 为 100!)?它的行为方式是否相同?
  • 调用GetAuthTokenAsync后,你如何访问token的结果?这对我来说似乎是一个可能的僵局。

标签: c# async-await task


【解决方案1】:

问题可能是没有等待对GetAuthTokenAsync 的调用:

Task<DataClass.AuthenticationToken> token = GetAuthTokenAsync(tbUsername.Text.Trim(), tbPassword.Text.Trim());

试试这个:

DataClass.AuthenticationToken token = await GetAuthTokenAsync(tbUsername.Text.Trim(), tbPassword.Text.Trim());

【讨论】:

  • 添加await 将不起作用,因为它分配给Task&lt;T&gt;,而不是获取结果。
  • 不错的收获。修好了。
【解决方案2】:

您可以先尝试检查client.PostAsJsonAsync(requestURL, request) 是否会返回一个同步调用的值,即无需等待调用:

response = client.PostAsJsonAsync(requestURL, request).Result;

如果它返回一个值,则问题可能出在调用 GetAuthTokenAsync 的周围代码中,即它没有等待任务完成或类似问题。

【讨论】:

  • 在没有“等待”的情况下调用 client.PostAsJsonAsync 立即返回响应状态 =“等待激活”。我无法添加 .Result;当使用“等待”时,因为有一个警告。我使用 no wait 和 .Result 进行测试,它确实等待了一些东西。尽管 Fiddler 返回了正确的 authocodes,但我得到的是“未经授权”。所以......要做什么下一个试试?
  • 好吧,如果你得到“未经授权”,这意味着你毕竟收到了一些回应。研究为什么你得到“未经授权”:无效的令牌、错误的密码,诸如此类。
【解决方案3】:

尝试最后一个建议:

DataClass.AuthenticationToken token = await GetAuthTokenAsync(tbUsername.Text.Trim(), tbPassword.Text.Trim());

编译器不允许将此作为​​对异步任务的调用。我用来调用任务的格式是正确的。继续试验了 5 天,我发现不使用 TASK 等待方法。相反,我将任务更改为函数 GetAuthToken(parameters)。 使用不带 await 的 PostAsJsonAsync 并添加 .Result,该方法等待结果。

HttpResponseMessage response = client.PostAsJsonAsync(requestURL, request).Result;
if (response.IsSuccessStatusCode)
{
    // Ok 
    string data = response.Content.ReadAsStringAsync().Result;                
    thisToken = Newtonsoft.Json.JsonConvert.DeserializeObject<DataClass.AuthenticationToken>(data);
}

我使用 Newtonsoft 反序列化数据,瞧。我可以继续我的项目!

请注意所有试图提供帮助的人。谢谢你。但是,如果您首先测试您的建议,因为有些建议不是有效的编码语法,这会很有帮助。

【讨论】:

    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 2023-03-13
    • 2013-08-06
    相关资源
    最近更新 更多