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'的第一个参数可以找到(您是否缺少使用指令或程序集引用?)

有解决这个问题的办法吗?

WebAPI: 'IHttpActionResult'不包含'GetAwaiter'的定

异常消息解释您正在尝试返回不可等待的内容。不需要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);
    });
}