[英]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.