2017-07-24 75 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,我很高兴它有帮助 –