我需要编写一个应用程序来接收来自网站的请求,以检索诸如销售帐户的详细信息或将销售发票过帐到帐户系统。我们将链接到许多帐户系统,每个帐户系统都有自己的工具包/ 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调用?
任何建议都将不胜感激
答案 0 :(得分:0)
好吧,我会解决这个问题。如果需要排队机制,可以考虑使用专用队列服务,例如msmq,rabbitmq,activemq。他们的客户通常是安全和合并的,至少每个请求都可以有一个客户端实例。
否则,如果您需要这样做,您应该考虑使用ConcurrentQueue并尝试避免锁定。