队列Web API请求

时间:2013-09-09 13:36:13

标签: architecture asp.net-web-api

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

该网站可能位于DMZ中,并且帐户系统几乎肯定会成为域的一部分并且位于防火墙后面

由于工具包的工作方式,一个工具包对象一次只能处理一个请求。我已经将概念证明放在一起,它基本上是一个自主主机Web API(现在在控制台应用程序中,但是要成为Windows服务),它正在处理特定区域(如代码)的请求;销售帐户和销售发票(更多内容将添加到真实API中)。这些区域中的每一个都使用自己的帐户工具包对象来执行特定任务。我做了什么,这是我知道的不对,但我不知道如何正确地做。因为我一次只能处理一个请求,所以我正在锁定静态对象,处理请求而不处理下一个请求,直到上一个请求解锁了静态对象。

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

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;
    }
}

但我想知道的是我应该如何真正做锁定位,还是有更具体的方法来排队网络API调用?

任何建议都将不胜感激

1 个答案:

答案 0 :(得分:0)

好吧,我会解决这个问题。如果需要排队机制,可以考虑使用专用队列服务,例如msmq,rabbitmq,activemq。他们的客户通常是安全和合并的,至少每个请求都可以有一个客户端实例。

否则,如果您需要这样做,您应该考虑使用ConcurrentQueue并尝试避免锁定。