0

我需要编写一个应用程序来接收来自网站的请求,以检索诸如销售帐户详细信息之类的信息或将销售发票发布到帐户系统。我们将链接到许多帐户系统,每个系统都有自己的工具包/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;
    }
}

但我想知道的是我应该如何真正做锁定位,或者是否有更具体的方式我应该排队 Web API 调用?

任何建议将不胜感激

4

1 回答 1

0

好吧,我会以不同的方式解决这个问题。如果需要队列机制,可以考虑使用专门的队列服务,比如msmq、rabbitmq、activemq。他们的客户通常是安全的和共享的,至少您可以为每个请求提供一个客户实例。

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

于 2013-09-09T13:40:41.263 回答