【问题标题】:How to use Hangfire job queuing for processing requests from ASP.NET HttpHandler?如何使用 Hangfire 作业队列处理来自 ASP.NET HttpHandler 的请求?
【发布时间】:2017-07-24 20:47:28
【问题描述】:

我正在尝试使用Hangfire 对通过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

{"检测到具有类型的属性'Context'的自引用循环 'System.Web.HttpContext'。路径 'ApplicationInstance'。"}

阅读主题后,似乎HttpContext 无法序列化,这是作业管理Hangfire 做的第一步(见上一个链接)。

如何使用 Hangfire 处理我的 HTTP 请求?

【问题讨论】:

  • 这永远行不通。您不能只在这样的线程上传递 HTTP 上下文,并期望您可以在最后写回响应。 Hangfire 不应该用于此类工作。为什么不在控制器中使用 async/await?

标签: c# asp.net queue hangfire


【解决方案1】:

简答:不可能

更长的答案:本质上不可能序列化 HttpContext 并稍后对其进行操作。如果您尝试做的“后台工作”就像您展示的代码 sn-p 一样简单,您应该使用 async/await 来避免阻塞线程并尽可能保持服务器响应。如果后台工作实际上受 CPU 限制,并且您无法使用 async/await,则需要从 HttpContext 中提取与开始工作相关的数据,然后将其传递。在这种情况下,您应该立即向客户端返回响应,为他们提供回调地址,他们可以在其中轮询更新或在作业完成时通过 websocket 等实时通知。

【讨论】:

  • 谢谢。实际上,我的应用程序的目的是将客户端数据库与服务器数据库同步。我想实现一个队列进程,因为我不想要多个并行同步进程。它一次只需要运行一个同步进程。
  • np,我很高兴它有帮助
猜你喜欢
  • 2018-10-06
  • 1970-01-01
  • 2020-03-04
  • 2018-01-20
  • 2011-06-18
  • 2016-10-28
  • 1970-01-01
  • 2013-09-20
  • 2019-11-05
相关资源
最近更新 更多