我希望以JSON格式返回参与者人数。我下面有一个ParticipantRepository
类:
public async Task<int> GetCountAllParticipants()
{
return await context.Participants
.CountAsync();
}
我的ParticipantsController
类在下面:
[HttpGet("all/count")]
public JsonResult GetCountAllParticipants()
{
return Json(repo.GetCountAllParticipants());
}
这在代码上没有错误,但是它返回了如下所示的自引用循环:
Newtonsoft.Json.JsonSerializationException:为类型为“ System.Runtime.CompilerServices.AsyncTaskMethodBuilder
1+AsyncStateMachineBox
1 [System.Int32,Restore.API.Repositories.ParticipantRepository.ParticipantRepository + d__15”的属性“ task”检测到自引用循环]”。路径'stateMachine。<> t__builder'。
当我如下修改存储库时:
public async Task<int> GetCountAllParticipants()
{
return context.Participants.Count();
}
这次,我收到此错误:
此异步方法缺少“等待”运算符,将同步运行。考虑使用'await'操作符来等待非阻塞API调用,或使用'await Task.Run(...)'在后台线程上进行CPU绑定的工作
但是我有正确的返回JSON对象,如下所示:
{
"result": 8,
"id": 1,
"exception": null,
"status": 5,
"isCanceled": false,
"isCompleted": true,
"isCompletedSuccessfully": true,
"creationOptions": 0,
"asyncState": null,
"isFaulted": false
}
我可以这样使用它,但是我认为这不是正确的方法。如何返回参加人数?这样做的“正确”方法是什么?
任何帮助将不胜感激。
答案 0 :(得分:1)
必须等待整个链条。因此,您会这样做:
public async Task<int> GetCountAllParticipants()
{
return await context.Participants.CountAsync();
}
[HttpGet("all/count")]
public async Task<JsonResult> GetCountAllParticipants()
{
return Json(await repo.GetCountAllParticipants());
}
如果这是.NET Framework(而不是Core),那么您可能希望在async方法调用的末尾使用.ConfigureAwait(false),这样就不会在UI线程上强制它继续执行...。您不在乎语言/文化设置。
编辑:如果要返回您提到的特定json属性,则可以这样做:
[HttpGet("all/count")]
public async Task<JsonResult> GetCountAllParticipants()
{
var count = await repo.GetCountAllParticipants()
return Json(new { result = count });
}
但是,这会将其视为#,如果您希望将其作为“”(字符串),请执行以下操作:
[HttpGet("all/count")]
public async Task<JsonResult> GetCountAllParticipants()
{
var count = await repo.GetCountAllParticipants()
return Json(new { result = count.ToString() });
}
答案 1 :(得分:-1)
我认为这是重复的 https://stackoverflow.com/a/34501661/3623172
您使用ToListAsync()然后返回count()