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,我很高兴它有帮助