我正在进行一次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"}]}
那么,看起来好像反序列化可能卡住了吗?
答案 0 :(得分:3)
您可能因为陷入异步状态而陷入僵局。您不应该调用.Wait()
和.Result
,请正确使用异步代码。
首先创建方法async
并返回一个Task
:
private async Task load_click()
{
// snip
}
然后await
正确地调用您的HTTP:
var users = await Http.GetJsonAsync<UsersPageData>("api/ShowerQ/Users");