如何使用 Hangfire 作业排队来处理来自 ASP.NET HttpHandler 的请求?

How to use Hangfire job queuing for processing requests from ASP.NET HttpHandler?

我正在尝试使用 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

{"Self referencing loop detected for property 'Context' with type 'System.Web.HttpContext'. Path 'ApplicationInstance'."}

看了题目,好像是HttpContext不能连载,这是Hangfire作业管理的第一步(见前面的link)。

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

简答:不可能

更长的答案:本质上不可能序列化 HttpContext 并在以后对其进行操作。如果您尝试执行的 "background work" 与您展示的代码片段一样简单,您应该使用 async/await 来避免阻塞线程并使您的服务器尽可能保持响应。如果后台工作实际上是 CPU 绑定并且您使用 async/await 不可行,您需要从与开始工作相关的 HttpContext 中提取数据并将其传递。在这种情况下,您应该 return 立即响应客户端,为他们提供回调地址,他们可以在其中轮询更新或在作业完成时通过类似 websocket 的方式实时收到通知。