C# web api方法的排队

C# web api方法的排队,c#,.net,asp.net-web-api,C#,.net,Asp.net Web Api,我有一个web api方法:- [POST] public void SaveData() { } 我希望实现的方式是,如果SaveData()方法中的代码已经被执行,那么SaveData方法将不接受任何其他调用 i、 e.我想在队列中保留对savedata方法的调用。 当一个呼叫结束时,将发生另一个呼叫 注意:-调用SaveData()方法不在我的范围内。我无法决定同步或异步调用此api方法 我的职责范围内唯一的事情就是为SaveData方法编写代码。它将被称为彻底的外部系统。我强烈建议您在

我有一个web api方法:-

[POST]
public void SaveData()
{
}
我希望实现的方式是,如果SaveData()方法中的代码已经被执行,那么SaveData方法将不接受任何其他调用

i、 e.我想在队列中保留对savedata方法的调用。 当一个呼叫结束时,将发生另一个呼叫

注意:-调用SaveData()方法不在我的范围内。我无法决定同步或异步调用此api方法


我的职责范围内唯一的事情就是为SaveData方法编写代码。它将被称为彻底的外部系统。

我强烈建议您在应用程序中使用消息队列系统mjwills在评论部分提供了两个很棒的MessageBroker软件解决方案:

  • :是开源的轻量级产品,易于在本地和云中部署
  • :是AWS提供的完全管理的基于云的解决方案
在您可以在应用程序中使用这些解决方案之前,需要进行集成,但在集成之后,将非常简单:

[POST]
public void SaveData()
{
    var msg = new SaveDataMessage();
    /* populate msg object... */

    this.queueClient.Publish(msg);
}
此伪代码将消息发布到队列。在另一端,队列订户将按顺序接收和处理这些消息,例如:

public void OnMessage(SaveDataMessage msg)
{
    /* process message... */
}
其他好处是i)订阅者可以在独立进程中运行,这意味着您的API请求可以立即返回,后台工作人员将负责处理消息ii)随着应用程序的扩展,此架构将与负载平衡API兼容

在应用程序的早期构建这种结构绝对值得。从长远来看,它会给你更多的灵活性和生产力


我写了一篇关于这个主题的文章,其中包含了这个答案的更详细的补充信息:

您使用的是web场还是web花园?您在应用程序中使用的是队列系统(例如RabbitMQ或SQS)?否。在这种情况下,不使用任何提及的内容,请将
静态对象bob=new object()然后使用
lock(bob)
inside
SaveData
。这是最简单的解决方案(尽管这意味着您的其他请求将被阻止)。另一种探索方法是使用
BlockedCollection
(使用一个单独的线程一次读取一个)。@mjwills我不确定您的解决方案是否会将请求“排队”,并且在释放锁时,它们将保持相同的顺序。另外,你对排队系统的想法在这里看起来是一个答案。只要在
SaveData
action中尽快将任务放入队列即可。使用排队任务Id立即响应也可能是一种好方法。