2012-08-28 70 views
0

我有一个web服务需要使用jabber-net对象向客户端发送XMPP消息。 (用于处理打印:当Web服务需要打印某些内容时,我将XMPP消息发送到在插入打印机的特定机器上运行的Windows窗体客户端,并使用打印作业类型和URL,以及然后客户端下载数据并将其发送到打印机,该通信通道也将用于其他POS功能,如打开至抽屉,与芯片和引脚设备通话等,因此打印替代品将不会有帮助。ASP.NET Webgarden共享静态对象

我有一个静态对象,其中包含jabber-net对象的实例,它登录到XMPP服务器,然后可用于发送消息。

这工作得很好单线程。当我将Web服务转换为Web服务器以便它可以在多个线程上工作时,似乎每个线程都有它自己的jabber-net对象实例,所以它们都试图在XMPP服务器上登录曾经是同一个用户,这意味着他们不断被踢出去。

问题:有没有什么办法可以在Web花园的所有线程之间共享一个活动对象(可能处理事件,而不是序列化对象,而不仅仅是数据),如果是的话,最好的方法是什么?

回答

0

Web花园基本上是微型网站农场,应该这样对待 - 寻找将涉及网络农场的解决方案,这些解决方案将适用于您的情况。

我被会议和网络花园发现了,最终我转向了一个进程外会话提供者(我使用了一个基于memcached的提供者,但是SQL Server提供者已经工作了)。你可以做类似的事情,并有一个eac线程可以请求对象的共享提供者。

虽然这不会解决您的事件问题 - 我怀疑这样可以解决问题,您可能必须切换到消息系统(例如msmq),并且所有消息都由单个进程处理。

+0

问题是,基于XMPP的方法*是我发送消息的方式。 MSMQ不会有太大的帮助,因为“无法从没有直接连接的计算机上的队列中读取消息。” 我想我可以用每个线程分别用一个唯一的名字签名到XMPP服务器,尽管找出哪些名字可以自由登录会很有趣......也许如果我深入了解jabber-net,我会工作了解如何使用相同的名称和不同的资源对其进行签名。 –

+0

好吧,这将作为答案,因为添加行 _JabberClient.Resource =“myserver”+ Thread.CurrentThread.ManagedThreadId.ToString(); 已排序的所有内容:所有线程可以一次快乐地登录,他们都能够发送消息,并且任何消息/在线状态通知都会被所有人收到。 –