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

C# 如何使用Hangfire作业队列处理来自ASP.NET HttpHandler的请求?,c#,asp.net,queue,hangfire,C#,Asp.net,Queue,Hangfire,我正在尝试使用Hangfire对通过HttpHandler获取的数据进行排队处理 Hangfire服务器配置正确,可以使用简单的功能正常工作,如所述 我似乎找不到使用我的HttpContext数据处理Hangfire的方法 此代码适用于: public void ProcessRequest(HttpContext context) { var jobId = BackgroundJob.Enqueue( () =>

我正在尝试使用
Hangfire
对通过
HttpHandler
获取的数据进行排队处理

Hangfire服务器配置正确,可以使用简单的功能正常工作,如所述

我似乎找不到使用我的
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);
        }
我得到了一个
背景工作客户例外情况

检测到类型为的属性“上下文”的{“自引用循环” 'System.Web.HttpContext'。路径'ApplicationInstance'。“}

在阅读了这个主题之后,似乎无法序列化
HttpContext
,这是作业管理的第一步(请参阅前面的链接)


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

简短回答:这是不可能的


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

简短回答:这是不可能的


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

这是行不通的。您不能像这样在线程上传递HTTP上下文,并期望在最后写回响应。这种工作不应使用壁炉。为什么不在控制器中使用async/await?这是行不通的。您不能像这样在线程上传递HTTP上下文,并期望在最后写回响应。这种工作不应使用壁炉。为什么不在控制器中使用async/await?谢谢。实际上,我的应用程序的目的是将客户端数据库与服务器数据库同步。我想要实现一个队列进程,因为我不想要多个并行同步进程。它一次只需要运行一个同步过程。np,我很高兴它帮助了您谢谢。实际上,我的应用程序的目的是将客户端数据库与服务器数据库同步。我想要实现一个队列进程,因为我不想要多个并行同步进程。它一次只需要运行一个同步过程。np,我很高兴它有帮助