WebAPI: 'IHttpActionResult'不包含'GetAwaiter'的定
本文关键字:GetAwaiter 的定 包含 WebAPI IHttpActionResult | 更新日期: 2023-09-27 18:01:33
早上好,这是我在社区的第一个问题。我正在使用c# WebAPI框架,我试图改变我所有的控制器的方法是异步的。我的控制器从GenericController扩展,它有一个方法(CallWF),从DLL调用方法,它还处理各种异常。
Layer1/Controllers <===> Layer2/GenericController。CallWF & lt; = = =>Layer3/DLL方法
这是我的GenericController。CallWF代码:
protected IHttpActionResult CallWF<T>(Func<T> action)
{
try
{
return Ok(action.Invoke());
}
catch (Exception e1)
{
return( BadRequest( GetMyExceptionMessage(e1)) );
}
}
protected IHttpActionResult CallWF(Action action)
{
try
{
action.Invoke();
return Ok();
}
catch (Exception e1)
{
return( BadRequest( GetMyExceptionMessage(e1)) );
}
}
这里是一个控制器方法的例子
[ResponseType(typeof(string))]
[Route("MyMethodA")]
public IHttpActionResult MyMethodA(int arg1)
{
return CallWF<string>(
() => {
return repositoryA.itsMethodA(arg1);
});
}
可以看到,该方法是同步的。现在我想把它变成异步的。在阅读了一些网站解释如何制作异步函数后,我认为这将是解决方案。
[ResponseType(typeof(string))]
[Route("MyMethodA")]
public async Task<IHttpActionResult> MyMethodA(int arg1)
{
return await CallWF<string>(
() => {
return repositoryA.itsMethodA(arg1);
});
}
但是这样做,会出现以下错误:
CS1061 'IHttpActionResult'不包含'GetAwaiter'的定义,并且没有扩展方法'GetAwaiter'接受类型'IHttpActionResult'的第一个参数可以找到(您是否缺少using指令或程序集引用?)
尝试另一种方法,我尝试为异步创建一个新的CallWF函数。方法如下
protected async Task<IHttpActionResult> CallWFAsync<T>(Func<T> action)
{
try
{
IHttpActionResult res = Ok( action.Invoke());
return await Ok( action.Invoke() );
}
catch (Exception e1)
{
return ( BadRequest(GetMyExceptionMessage(e1)) );
}
}
这样做,它给了我标题错误
CS1061 'OkNegotiatedContentResult'不包含'GetAwaiter'的定义,并且没有扩展方法'GetAwaiter'接受类型'OkNegotiatedContentResult'的第一个参数可以找到(您是否缺少使用指令或程序集引用?)
有解决这个问题的办法吗?
异常消息解释您正在尝试返回不可等待的内容。不需要await
,只返回Task
。除非在方法中实际需要异步功能,您可以简单地使用Task.FromResult
Task
。引用本文:http://blog.stephencleary.com/2012/02/async-and-await.html
提示:如果您有一个非常简单的异步方法,您可能能够编写时不使用await关键字(例如,使用Task.FromResult)。如果您可以不使用await编写它,那么就应该这样做在不使用await的情况下编写它,并从方法中删除async关键字。返回Task的非异步方法。FromResult比返回值的异步方法。
使用你的第一次尝试,它可以被重构成这样…
[ResponseType(typeof(string))]
[Route("MyMethodA")]
public Task<IHttpActionResult> MyMethodA(int arg1) {
var result = CallWF<string>(
() => {
return repositoryA.itsMethodA(arg1);
});
return Task.FromResult(result);
}
在第二种方法中,如果您想转换CallWF
方法,您可以使用相同的方法
protected Task<IHttpActionResult> CallWFAsync<T>(Func<T> action) {
IHttpActionResult result = null;
try
{
result = Ok(action.Invoke());
} catch (Exception e1) {
result = BadRequest(GetMyExceptionMessage(e1));
}
return Task.FromResult(result);
}
现在你就可以做我们在第一个例子中尝试做的事情了通过调用CallWFAsync
方法
[ResponseType(typeof(string))]
[Route("MyMethodA")]
public async Task<IHttpActionResult> MyMethodA(int arg1)
{
return await CallWFAsync<string>(
() => {
return repositoryA.itsMethodA(arg1);
});
}