从Blazor客户端HttpClient.GetJsonAsync调用返回(带有数据),但是超时

时间:2019-05-13 09:52:46

标签: c# blazor

我正在进行一次Http.JsonAsync<MyType>("api/MyController/Users");通话,通话很快返回,但是5秒钟后超时,而不是给我数据。

我打了其他类似的电话,效果很好,但是发生了一些奇怪的事情。

我从标准的气象服务Blazor客户端模板开始,并且一切正常

我从按钮事件中开始

<button onclick=@load_click>LOAD!</button>

@functions {
private void load_click()
{
    try
    {
        Logger.Log($"about to call PopulateExistingUsers");

        var taskUsers = Http.GetJsonAsync<UsersPageData>("api/ShowerQ/Users");

        Logger.Log($"returned from async requesting users");
        if (!taskUsers.Wait(5000))
        {
            throw new Exception($"timeout!");
        }
        var users = taskUsers.Result;
        Logger.Log($"populated existing users ok.  Users.Count = {users.Users.Count()}");
    }
    catch (Exception e)
    {
        Logger.Log(e.ToString());
    }
}

服务器端控制器代码:

[HttpGet("Users")]
public UsersPageData GetUsers()
{

    try
    {
        var users = _repos.GetAllUsers().ToList();
        Log($"returned from GetALlUsers() with {users.Count} users");

        return new UsersPageData() {Users = users};
    }
    finally
    {
        Log($"aft6er returning from method {nameof(GetUsers)}");
    }
}

Logger.Log只是Console.Writeline,它会转到浏览器控制台-非常方便!

预期: 日志输出到控制台: “填充现有用户,确定。Users.Count= 3”

实际日志:

我得到的输出是:

WASM: 09:31:26.49:about to call PopulateExistingUsers

WASM: 09:31:26.56:returned from async requesting users

WASM: 09:31:31.57:System.Exception: timeout!

WASM:   at ShowerQWeb2.Client.Pages.Index.load_click () [0x00048] in C:\Users\XXXX\Source\repos\ShowerQWeb2\ShowerQWeb2.Client\Pages\Index.razor:62 

和服务器端(它们在同一台计算机上运行,​​因此时钟之间的时钟间隔是一个小时)

10:31:26.68:returned from GetALlUsers() with 3 users

10:31:26.68:aft6er returning from method GetUsers

Chrome网络调试显示返回的内容: 响应标头:

Date: Mon, 13 May 2019 09:31:26 GMT
{"users":[{"id":1,"name":"David XX"},{"id":2,"name":"Sumith YY"},{"id":3,"name":"David ZZ"}]}

那么,看起来好像反序列化可能卡住了吗?

1 个答案:

答案 0 :(得分:3)

您可能因为陷入异步状态而陷入僵局。您不应该调用.Wait().Result,请正确使用异步代码。

首先创建方法async并返回一个Task

private async Task load_click()
{
    // snip
}

然后await正确地调用您的HTTP:

var users = await Http.GetJsonAsync<UsersPageData>("api/ShowerQ/Users");