簡體   English   中英

ASP.NET核心返回HTTP響應並繼續具有相同上下文的后台工作者

[英]ASP.NET Core Return HTTP Response And Continue Background Worker With Same Context

對不起,這是一個冗長的設置/問題。 我目前正在使用C#ASP.NET Core 2.1開發API。 我有一個POST端點,執行大約需要5-10秒(這很好)。 我需要添加可能需要相當長時間才能執行的功能。 我目前的負載測試需要額外的3分鍾。 說實話,生產可能會花費更長的時間,因為我無法真正得到一個好的答案,我們可以期望處理多少這些事情。 從用戶體驗的角度來看,等待這一長時間是不可接受的,因為前端正在等待現有POST請求的結果。 為了維持可接受的用戶體驗。

使用默認的ASP.NET Core DI容器將所有服務設置為瞬態。 此應用程序使用EF Core並以與服務相同的方式設置(抱歉,我現在沒有工作,忘記了安裝文件中的確切措辭)。

我首先嘗試創建一個后台工作程序,但是在將響應發送到客戶端之后,內部對象將開始被處理(即實體數據庫上下文),並且當繼續嘗試使用所述上下文執行代碼時,它將最終拋出錯誤(因為他們被處置了所以有意義。

我能夠讓一個后台工作者主要使用注入的IServiceScopeFactory(默認的ASP.NET Core實現)。 我的所有代碼都成功執行,直到我嘗試保存到數據庫。 我們重寫了SaveChangesAsync()方法,以便它自動將屬性CreatedByName,CreatedTimestamp,UpdatedByName和UpdatedTimestamp分別更新到當前跟蹤的實體。 由於此邏輯由從IServiceScopeFactory創建的對象使用,因此它似乎不共享相同的HttpContext,因此不會正確更新CreatedByName和UpdatedByName(嘗試將這些設置為null但DB列不接受null) 。

就在我離開工作之前,我創造了一些似乎有用的東西,但它看起來很臟。 我沒有在后台工作程序中使用IServiceScopeFactory來創建新作用域,而是使用WebClient對象創建了一個模擬請求,該對象指向當前正在執行的同一API中的端點。 這確實允許響應以及時的方式發送回客戶端,這確實繼續在服務器上執行新功能(正確更新我的實體)。

我道歉,我目前沒有工作,目前無法提供代碼示例,但如果要完全回答這篇文章是必需的,我稍后會介紹一些。

理想情況下,我希望能夠啟動我的請求,處理現有POST中的邏輯,將響應發送回客戶端,並使用相同的上下文(包括包含身份信息的HttpContext)繼續執行新功能。 我的問題是,這可以在不創建模擬請求的情況下完成嗎? 這可以通過后台工作者使用與原始線程相同的上下文來完成(我知道這聽起來有點奇怪)? 他們的另一種方法是我完全失蹤了嗎? 提前謝謝。

查看Hangfire非常易於使用的庫來執行后台任務。

暫無
暫無

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

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