2012-10-23 217 views
1

我有三个应用程序在三个独立的应用程序池中运行。其中一个应用程序是一个很少有人有权访问的管理应用程序。管理应用程序允许的功能之一是创建停机通知。因此,当用户进入管理应用程序并创建停机通知时,其他两个应用程序应该接收新的通知并将其显示在登录页面上。ASP.NET缓存管理

问题是,这些通知被缓存,并且每个应用都位于单独的应用程序池中,因此管理应用程序无法清除其他两个应用程序中的停机通知缓存。

我想弄清楚这个方法。我唯一能想到的是在数据库中插入一条表示缓存需要清除的记录,其他两个应用程序将在加载登录页面时检查数据库。有没有人有另一种方法可能会更清洁一点?

*注意,这比停机通知更广泛,但我只是以此为例。

编辑

重新启动应用程序池不是因为它很可能会杀后台线程可行的。

+0

是从管理应用程序为两个应用程序重新启动应用程序池为您提供的解决方案吗? – Tariqulazam

+0

您提到清除缓存,但尚不清楚停机通知如何进入其他两个应用程序的缓存?其他两个应用程序如何“接到新的通知?” –

+0

Zaid,他们调用缓存,如果它尚未填充,则从数据库获取数据并将其存储在缓存中,否则返回缓存的内容。 – Chris

回答

2

如果我理解正确,你基本上是试图从管理应用程序发送消息到其他应用程序。也许你应该考虑在这些可以从管理应用程序调用的应用程序上创建WCF服务。如果您不想使用不同的应用程序,那么这是一种标准的沟通方式。共享媒体这样的数据库,它不会强制你使用轮询模式。

+0

我开始沿着这条路线走下去,但由于每个应用程序都是独立的域名(http // www.a.com,http // www.b.com,http // www.c.com),我是否需要处理交叉域名的网络服务,或者我可以做到这一点,而不必去网络? – Chris

+0

如果应用程序托管在同一个IIS上,您可能会始终将通信限制在本地主机而不将服务暴露给互联网。您也可以使用其他绑定,例如NetNamedPipeBinding http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx。 – empi

0

如果是缓存的数据库信息,您可以试试设置时的运气和SqlCacheDependency。否则,我会建议不要使用ASP.NET缓存,并找到使用分布式缓存方案的第三方解决方案,这样所有应用程序都使用一个缓存而不是3个单独的缓存。

1

另一种看待这种情况的方法是,这基本上是一个应用程序间消息传递问题,它有许多库已经可以帮助您解决问题。想到这个,我想起了RabbitMQ。它有一个C#客户端,可以随时访问。 MSMQ是另一种潜在的技术,并且已经与Windows一起提供 - 您只需要安装它。

+0

MSMQ也可以工作,它已经是Windows的一部分(可选安装)。你只需要安装它。 – Kevin

+0

@Kevin那会!一个好的电话。我会将其添加到我的答案。 – tmesser

0

我不是说这是最好的答案,甚至是正确的答案,它就是我所做的。

我有一系列电子商务网站在单独的服务器和数据中心,依靠从中央后台网站位置提取目录数据,然后在本地缓存它们。在我的第一次迭代中,我简单地使用了GET请求,即中央位置可以ping相应的消费网站来启动自己的缓存刷新例程。我在每台电子商务服务器上都使用了SSL,因为我已经拥有了该设置,并且可以通过SSL GET发送证书以便后台安全地启动刷新。

在稍后的阶段,我们发现在后台使用套接字更有效,每个消费网站都将作为客户端,并监听数据的变化。后台网站随后可以在特定账户发生变化时与其相应的网站进行沟通,然后进行非常具体的沟通。这种方法更细化,我们可以根据需要更新小数据块,而不是大块分片更新,但这肯定比我们的第一次尝试更复杂。