客户端与Windows应用程序的通信

时间:2012-07-21 17:36:37

标签: c# asp.net browser polling

我有一个基于网络的拣货/包装解决方案来交付订单(asp.net/c#)。订单在浏览器中标记为已打包,然后立即将标签信息添加到我们的数据库中,为下一部分做好准备......

标签打印是通过Windows应用程序(用C#编写)完成的,并且这样做是因为我找不到让浏览器自动打印标签的方法(即用户无需点击打印/确定等等。)

问题:

Windows应用程序每10秒轮询一次(可能会更改)以查看该选择器/打包器是否有任何新标签。现在,如果我可以让浏览器与标签应用程序通信,那么轮询将是不必要的,因为选择器/打包器只需单击“准备发送”并且将创建标签数据。

轮询过程中提取的数据并不多,但我担心随着我们添加更多的选择器/打包器站,轮询过程可能会对Web服务器/数据库产生影响(因为所有电台将进行投票)。此外,拣货员/包装商不想等待等待标签,所以延长轮询时间是不可能的(如果我想尽可能快的话)

方案吗

所以,理想情况下,我想要一种在浏览器和应用程序之间进行通信的方式(如果可能的话)。或者任何不需要轮询的方法。也许类似于Comet的东西,它允许服务器在添加新标签时向应用程序发送消息。

理想情况下,一个不需要特定浏览器的解决方案。但这可能要求太多了。

长期解决方案是将基于网络的拣货包装解决方案转移到标签应用程序中,但这将是很多的工作!

我希望这很清楚,也不会太罗嗦。如果我可以在这里添加任何其他详细信息,请告诉我。提前谢谢。

修改

我正在研究websockets作为一个想法。任何建议都将受到欢迎!

更新

感谢所有评论。我现在对如何解决问题有了一些想法:

  1. 的WebSockets。由于我无法轻松访问系统(地理距离),因此可能存在防火墙问题。
  2. 从应用程序中读取浏览器Cookie。可能的解决方案http://www.codeproject.com/Articles/330142/Cookie-Quest-A-Quest-to-Read-Cookies-from-Four-Pop。这涵盖了仓库中使用的所有浏览器。我可以轮询本地cookie值并查看是否已创建任何新标签,然后下载它们。因此,不对数据库服务器进行轮询。
  3. ActiveX控件。限于IE,并且在每台PC上安装它可能会遇到一些安全/设置问题。
  4. 保持代码不变。测量数据库服务器上的负载是否过多或正常。

4 个答案:

答案 0 :(得分:1)

您可以在C#应用程序中创建本地WebSocket服务器,然后使浏览器连接到该服务器并发送您需要打印的数据。

但是,我不确定这是你需要的。在我看来,你需要将图形数据传递给你的应用程序,这可能是非常棘手的只使用javascript。

答案 1 :(得分:1)

实现Web应用程序和桌面应用程序之间通信的适当方法是通过两个应用程序通信的服务器。

您可以使用任何网络服务器(例如node.js nodejs.org,以便您使用与服务器上的网络应用相同的javascript)并与之互动。您如何从桌面应用程序与服务器通信取决于其技术。但是,所有语言都有一些方法可以进行SOAP之类的http通信。

或者你可以尝试制作:
两个应用都使用socket.io与服务器通信。您可以从以下project借用代码。

答案 2 :(得分:0)

创建一个MSMQ(或您选择的队列实现),并在您的Windows应用程序中托管一个轮询MSMQ的WCF服务。

让您的ASP.NET应用程序将任何相关信息写入此队列,以便Windows应用程序中提取此信息的WCF服务将知道如何制作它并打印您的标签。

我提到队列的原因是为了可靠性,如果您的Windows应用程序由于任何原因而关闭,则至少会保留队列并等待您重新启动Windows应用程序。

虽然涉及一些民意调查,但它很快且几乎可以忽略不计。使用NetMsmqBinding实现它是自动的,所有这一切都得到了解决。您需要做的就是配置它。

如果您选择非MSMQ队列,那么我不知道您是否仍然可以使用NetMsmqBinding,您可能需要创建自己的队列。

答案 3 :(得分:0)

我不确定,但似乎您的应用程序正在轮询文件系统以便打印这些新标签?您是否考虑在申请中使用FileSystemWatcher?您可以将其设置为观看目录并收到任何新的通知。