我有一個針對.NET 4.6的ASP.NET應用程序,我瘋了試圖找出爲什麼HttpContext.Current
在我的異步MVC控制器內第一次等待之後變爲空行動。ASP.NET 4.6異步控制器方法在等待後丟失HttpContext.Current
我檢查並三重檢查了我的項目是針對v4.6,並且web.config的targetFramework
屬性也是4.6。
SynchronizationContext.Current
在等待之前和之後都被分配,它是正確的,即AspNetSynchronizationContext
,而不是傳統的。
FWIW,有問題的等待線程繼續切換線程,這可能是因爲它調用外部I/O綁定代碼(異步數據庫調用),但這不應該是一個問題,AFAIU。
然而,它是! HttpContext.Current
變爲空的事實會導致我的代碼出現很多問題,並且對我沒有任何意義。
我檢查了the usual recommendations,我很積極我正在做我應該做的一切。我的代碼中絕對沒有ConfigureAwait
!
我做什麼都有,是一對夫婦的異步事件處理程序對我HttpApplication
例如:
public MvcApplication()
{
var helper = new EventHandlerTaskAsyncHelper(Application_PreRequestHandlerExecuteAsync);
AddOnPreRequestHandlerExecuteAsync(helper.BeginEventHandler, helper.EndEventHandler);
helper = new EventHandlerTaskAsyncHelper(Application_PostRequestHandlerExecuteAsync);
AddOnPostRequestHandlerExecuteAsync(helper.BeginEventHandler, helper.EndEventHandler);
}
我需要因爲自定義授權&清理邏輯,這就需要異步兩種。 AFAIU,這是支持的,不應該是一個問題。
還有什麼可能是我看到這令人費解的行爲的原因?
更新:額外的觀察。
SynchronizationContext
參考在等待和等待之前保持不變。但它的內部變化在下面的截圖中可以看出!
我不知道如何(或者即使),這可能在這一點上是有關我的問題。希望別人能看到它!
您是否在您的控制器操作上調用'ConfigureAwait(false)'? –
@Paulo:不,我不是。 – aoven
@Eldho:那會是什麼意思?我需要並希望控制器上的異步操作完全是因爲內部組件(即我提到的數據庫調用,例如)是異步的。刪除異步需要我禁用大量的代碼。 – aoven