2017-07-24 53 views
0

我試圖使用Hangfire排隊處理通過HttpHandler獲取的數據。如何使用Hangfire作業排隊處理來自ASP.NET HttpHandler的請求?

Hangfire服務器配置正確,並且可以正常工作,其功能類似於解釋爲here的簡單功能。

我似乎無法找到一種方法來使用我的HttpContext數據與Hangfire一起使用。

此代碼:

public void ProcessRequest(HttpContext context) 
     { 
      var jobId = BackgroundJob.Enqueue(
       () => Console.WriteLine("HELLO") 
      ); 
     } 

此代碼不工作:

public void ProcessRequest(HttpContext context) 
     { 
      var jobId = BackgroundJob.Enqueue(
       () => doServerSideWork(context) 
      ); 
     } 

public void doServerSideWork(HttpContext context) 
     { 
      context.Response.ContentType = "text/plain"; 
      context.Request.InputStream.Position = 0; 
      var jsonString = String.Empty; 
      using (var inputStream = new StreamReader(context.Request.InputStream)) 
      { 
       jsonString = inputStream.ReadToEnd(); 
      } 
      context.Response.Write(jsonString); 
     } 

我得到一個BackgroundJobClientException

{「財產檢測自參照循環」上下文「與 'System.Web.HttpContext'。Path'ApplicationInstance'。」}

看完這個主題後,好像HttpContext不能被序列化,這是作業管理Hangfire的第一步(參見上一個鏈接)。

如何使用Hangfire來處理我的HTTP請求?

+0

這是永遠不會工作。您不能只在這樣的線程上傳遞HTTP上下文,並期望您可以在最後回寫回響應。這種工作不應該使用Hangfire。你爲什麼不在控制器內部使用async/await? –

回答

3

簡短的回答:這是不可能的

再回應:這是本來就不可能後來序列化的HttpContext和行爲就可以了。如果您正在嘗試執行的「後臺工作」與代碼片段一樣簡單,那麼您應該使用async/await來避免阻塞線程並儘可能保持服務器的響應。如果後臺工作實際上是CPU綁定的,並且使用async/await不可行,則需要從HttpContext中提取與開始工作相關的數據,然後傳遞該數據。在這種情況下,您應立即向客戶端返回響應,爲他們提供一個回調地址,以便他們可以輪詢更新或在作業完成時實時通過類似websocket的通知。

+0

謝謝。實際上,我的應用程序的目的是將客戶端數據庫與服務器數據庫同步。我想實現一個隊列進程,因爲我不想要多個並行同步進程。它需要一次只運行一個同步過程。 – kaycee

+0

np,我很高興它有幫助 –