我不知道这段代码有什么问题,但它仍然没有回应所需的价值。
以下是我的示例代码:
WebAPI 2:
KOTController.cs
[HttpGet]
[Route("testasync")]
public IHttpActionResult TestAsync()
{
try
{
return Ok(_iKOTManager.TestAsync());
}
catch (Exception ex)
{
logger.Error(ex);
return null;
}
}
界面
IKOTManager.cs
Task<int> TestAsync();
KOTManager.cs
public async Task<int> TestAsync()
{
return await Task.Run<int>(() =>
{
return 999 + 23;
});
}
当我向此API发送请求时,它返回的内容不是数字
<TaskOfint xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/System.Threading.Tasks"/>
任何建议都会有所帮助。谢谢。
答案 0 :(得分:4)
您得到该响应是因为您返回了Task并且没有实际执行它。框架只是序列化任务对象并返回它。
重构动作以返回Task
,然后await
接口上的方法
[HttpGet]
[Route("testasync")]
public async Task<IHttpActionResult> TestAsync() {
try {
return Ok(await _iKOTManager.TestAsync());
} catch (Exception ex) {
logger.Error(ex);
return InternalServerError();
}
}
参考:Async/Await - Best Practices in Asynchronous Programming
此外,在异常的情况下,您应该返回适当的结果而不是null
。这最终应该被重构,因为控制器内的处理错误被认为是cross-cutting concern。控制器应尽可能精益。
[HttpGet]
[Route("testasync")]
public async Task<IHttpActionResult> TestAsync() {
return Ok(await _iKOTManager.TestAsync());
}
答案 1 :(得分:3)
您需要将控制器更改为async
,然后再await
任务。即。
public async Task<IHttpActionResult> TestAsync()
...
return Ok(await _iKOTManager.TestAsync());
请参阅async
/ await
here的文档。
答案 2 :(得分:0)
您的操作方法正在消耗/调用 async 方法,您需要将您的操作方法和同步返回Task<T>
作为返回类型,如:
[HttpGet]
[Route("testasync")]
public async Task<IHttpActionResult> TestAsync()
{
try
{
return Ok( await _iKOTManager.TestAsync());
}
catch (Exception ex)
{
logger.Error(ex);
return null;
}
}
如果我们调用异步方法,如果可能的话,我们应该使用调用方法同步并在所有调用链中返回Task<T>
。
希望它有所帮助!