簡體   English   中英

WebAPI:“ IHttpActionResult”不包含“ GetAwaiter”的定義

[英]WebAPI : 'IHttpActionResult' does not contain a definition for 'GetAwaiter'

早上好,這是我在社區中的第一個問題。 我正在使用C#WebAPI框架,並且正在嘗試將所有控制器的方法更改為異步方法。 我的控制器是從GenericController擴展的,該類具有一個方法(CallWF),該方法可以從DLL調用方法,並且還可以處理所有類型的異常。

Layer1 / Controllers <===> Layer2 / GenericController.CallWF <===> 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'的第一個參數(您是否缺少using指令或程序集引用?)

有什么解決辦法嗎? 希望有人能幫助我。

異常消息說明您正在嘗試返回無法等待的內容。 無需await只需返回Task 除非方法中實際需要異步功能,否則您可以簡單地使用Task.FromResult返回Task

引用本文: http : //blog.stephencleary.com/2012/02/async-and-await.html

提示:如果您有一個非常簡單的異步方法,則無需使用await關鍵字(例如,使用Task.FromResult)就可以編寫它。 如果可以不等待就可以編寫它,那么就應該不等待就可以編寫它,並從方法中刪除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方法來執行第一個示例中試圖做的CallWFAsync

[ResponseType(typeof(string))]
[Route("MyMethodA")]
public async Task<IHttpActionResult> MyMethodA(int arg1)
{
    return await CallWFAsync<string>(
    () => {
        return repositoryA.itsMethodA(arg1);
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM