Architecture 排队web API请求

Architecture 排队web API请求,architecture,asp.net-web-api,Architecture,Asp.net Web Api,我需要编写一个应用程序,接收来自网站的请求,以检索销售帐户的详细信息或将销售发票过账到帐户系统。我们将链接到多个帐户系统,每个帐户系统都有自己的工具包/API,或者可能是基于文件的 该网站可能位于非军事区,账户系统几乎肯定是该领域的一部分,并位于防火墙后面 由于工具箱的工作方式,一个工具箱对象一次只能处理一个请求。我已经把一个概念证明放在一起,它基本上是一个自宿主web API(目前在控制台应用程序中,但作为Windows服务),用于处理特定领域的请求,例如代码;销售帐户和销售发票(更多内容将添

我需要编写一个应用程序,接收来自网站的请求,以检索销售帐户的详细信息或将销售发票过账到帐户系统。我们将链接到多个帐户系统,每个帐户系统都有自己的工具包/API,或者可能是基于文件的

该网站可能位于非军事区,账户系统几乎肯定是该领域的一部分,并位于防火墙后面

由于工具箱的工作方式,一个工具箱对象一次只能处理一个请求。我已经把一个概念证明放在一起,它基本上是一个自宿主web API(目前在控制台应用程序中,但作为Windows服务),用于处理特定领域的请求,例如代码;销售帐户和销售发票(更多内容将添加到real API中)。每个区域都使用自己的accounts toolkit对象来执行特定任务。我所做的和这一点我知道是不正确的,但我不知道如何正确地做。因为一次只能处理一个请求,所以我正在锁定一个静态对象,处理该请求,并且在前一个请求解锁静态对象之前不处理下一个请求

控制器中的代码如下所示:

public class SalesInvoiceController : ApiController
{
    private static object lockObject = new Object();

    [ActionName("Save")]
    public int Post(SalesInvoice salesInvoice)
    {
        try
        {
            lock (lockObject)
            {
                TheRouters.TheSalesInvoiceRouter.PostSalesInvoice(salesInvoice);
            }
        }
        catch (Exception ex)
        {
            // TODO: remove as just for debugging
            Console.WriteLine(ex.ToString());
            throw;
        }

        return 0;
    }
}
但我想知道的是,我应该如何真正执行锁位,或者是否有一种更具体的方式来排队等待web API调用


任何建议都将不胜感激

好吧,我会用另一种方式来解决这个问题。如果需要排队机制,可以考虑使用专用队列服务,例如MSMQ、RabBMQ、Actudio Q。他们的客户端通常是安全的和池化的,至少每个请求都可以有一个客户端实例


否则,如果需要这样做,您应该考虑使用并尽量避免锁定。 有两个工具包一次只允许一个进程,例如基于文件的系统,它需要写入文件,因此一次只处理一个请求。我查看了MSMQ,但无法确定客户将如何请求获取销售帐户的详细信息,这是排队的,然后我无法计算,将销售帐户详细信息发送给客户我对您的业务规则一无所知,但我可以想象,您需要处理它们并将它们同步到数据库之类的地方。一旦从队列中提取数据并对后续请求进行处理,您就可以从数据库中读取数据。看看生产者/消费者范例,并向其中添加一个数据库。ps:忘记一次处理1。如果你不需要的话,就不建议使用锁定。如果我忘记了一次处理一个请求,我该如何处理一次写入多个请求的文件?