Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 带有队列处理的.NET核心web api_Asp.net Core_Queue_Asp.net Web Api2 - Fatal编程技术网

Asp.net core 带有队列处理的.NET核心web api

Asp.net core 带有队列处理的.NET核心web api,asp.net-core,queue,asp.net-web-api2,Asp.net Core,Queue,Asp.net Web Api2,如何设置一个.NET核心web api 接受字符串值 排队 和返回标志,表示消息已被接受(无论它是否已被处理) 还有一个例程,它不断检查队列,并逐个处理消息 根据要求,api将充当消息的接收者,消息在一分钟内可能会被点击数百次,而它接收的消息应该逐个处理。 我对web API有点陌生,所以想知道这样的设置是否合适,以及如何将不同的组件组合在一起 提前感谢。老实说,我不认为在一个进程中接收和处理消息是有意义的,因此我建议使用外部消息传递系统,如或您喜欢的任何其他现有系统,您可以在其中放置消息,

如何设置一个.NET核心web api

  • 接受字符串值
  • 排队
  • 和返回标志,表示消息已被接受(无论它是否已被处理)
还有一个例程,它不断检查队列,并逐个处理消息

根据要求,api将充当消息的接收者,消息在一分钟内可能会被点击数百次,而它接收的消息应该逐个处理。 我对web API有点陌生,所以想知道这样的设置是否合适,以及如何将不同的组件组合在一起


提前感谢。

老实说,我不认为在一个进程中接收和处理消息是有意义的,因此我建议使用外部消息传递系统,如或您喜欢的任何其他现有系统,您可以在其中放置消息,而另一个进程将使用它。这是一个很大的话题,你可以从

如果您仍然希望将其放在一个进程中,也可以创建一个后台任务队列,将消息放在那里,然后创建一个将从该队列中使用它们的队列

公共接口IBackgroundTaskQueue
{
作废QueueBackgroundWorkItem(Func workItem);
任务出列异步(
取消令牌取消令牌);
}
公共类BackgroundTaskQueue:IBackgroundTaskQueue
{
专用ConcurrentQueue _工作项=
新的ConcurrentQueue();
私有信号量lim _signal=新信号量lim(0);
公共无效队列BackgroundWorkItem(
功能(工作项)
{
if(workItem==null)
{
抛出新ArgumentNullException(nameof(workItem));
}
_workItems.Enqueue(workItem);
_信号。释放();
}
公共异步任务出列异步(
取消令牌(取消令牌)
{
wait_signal.WaitAsync(cancellationToken);
_TryDequeue(out var workItem);
返回工作项;
}
}
背景任务:

公共类QueuedHostedService:BackgroundService
{
专用只读ILogger\u记录器;
公共队列HostedService(IBackgroundTaskQueue任务队列,
伊洛格工厂(伐木厂)
{
TaskQueue=TaskQueue;
_logger=loggerFactory.CreateLogger();
}
公共IBackgroundTaskQueue任务队列{get;}
受保护的异步覆盖任务ExecuteAsync(
取消令牌(取消令牌)
{
_logger.LogInformation(“排队托管服务正在启动”);
而(!cancellationToken.IsCancellationRequested)
{
var workItem=await TaskQueue.DequeueAsync(cancellationToken);
尝试
{
等待工作项(取消令牌);
}
捕获(例外情况除外)
{
_logger.LogError(例如,
$“执行{nameof(workItem)}时出错。”);
}
}
_logger.LogInformation(“排队的托管服务正在停止”);
}
}
注册:

public void配置服务(IServiceCollection服务)
{
services.AddHostedService();
services.AddSingleton();
}
注入控制器:

公共类ApiController
{
专用IBackgroundTaskQueue队列;
公共ApiController(IBackgroundTaskQueue队列)
{
this.queue=队列;
}
公共IActionResult启动处理()
{
queue.QueueBackgroundWorkItem(异步令牌=>
{
//把处理代码放在这里
}
返回Ok();
}
}

您可以修改BackgroundTaskQueue以满足您的要求,但我希望您理解这背后的想法。

感谢Alex的指导。我正在探索您提供的选项。Alex,我可以请您看看我昨天在这个链接上发布的问题吗;谢谢!感谢Alex的简短实施。但是,您能否解释一下如何使用这种精确的方法来处理后台任务RabbitMQ@AsifIqbal,我不认为这种方法可以用于RabbitMQ,它的目的恰恰相反——在没有任何外部消息传递系统的情况下进行后台处理