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

3
我有一个基于Web的拣货/包装解决方案用于交付订单(asp.net/c#)。在浏览器中将订单标记为已包装,然后立即将标签信息添加到我们的数据库中,准备进行下一步操作...
标签打印是通过Windows应用程序(用C#编写)完成的,因为我找不到让浏览器自动打印标签(即无需用户单击打印/确定等按钮)的方法。
问题:
Windows应用程序每10秒轮询一次(可能会更改),以查看是否有任何新的拣货员/包装员的标签。现在,如果我能让浏览器与标签应用程序通信,则轮询将是不必要的,因为拣货员/包装员只需单击“准备发货”即可创建标签数据。
轮询过程中拉取的数据并不多,但我担心随着我们增加更多的拣货员/包装员站点,轮询过程可能会对Web服务器/数据库产生连锁反应(因为所有站点都会轮询)。此外,拣货员/包装员不想在等待标签时等待,因此无法延长轮询时间(如果可以,我希望它尽可能快)。
解决方案:
因此,理想情况下,我希望有一种在浏览器和应用程序之间进行通信的方法(如果可能)。或者任何消除轮询需求的方法。也许类似于Comet的东西,允许服务器在添加新标签时向应用程序发送消息。
理想情况下,不需要特定的浏览器即可解决问题。但这可能要求太多了。
长期解决方案是将基于Web的拣货/包装解决方案移动到标签应用程序中,但那将是很多工作!
希望这清晰明了,不会太啰嗦。如果我可以在这里添加任何其他细节,请告诉我。先感谢您。
编辑:
正在考虑WebSocket作为一个想法。欢迎提供任何建议!
更新:
感谢所有评论。现在我有一些关于如何解决问题的想法:
  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. 保留代码不变。判断对数据库服务器的负载是否过重或正常。

1
不确定这个问题的分辨率...但SignalR是否是一种可行的工具,可以将更新从Web服务器“推送”到您的本地计算机? - Richard B
嗨@RichardB,感谢回复。我已经使用轮询解决方案让代码运行了一段时间。客户正在转向另一个解决方案,所以这不再是一个问题。不过我会研究一下这个问题,因为拥有另一个工具总是很有用的! - Lee Taylor
4个回答

1
您可以在C#应用程序中创建本地WebSocket服务器,然后让浏览器连接到它并发送需要打印的数据。
但是,我不确定这是否符合您的需求。据我所知,您需要将图形数据传递给应用程序,仅使用JavaScript可能会非常棘手。

不用担心图形数据,我只需要浏览器告诉应用程序有一个或多个标签需要打印的能力。其余的都已完成。 - Lee Taylor

1
适当的方法来实现Web应用程序和桌面应用程序之间的通信是通过两个应用程序都可以与其通信的服务器。您可以获取任何Web服务器(例如node.js nodejs.org,它将允许您在服务器上使用与Web应用程序相同的JavaScript),并与其进行交互。从桌面应用程序与服务器通信的方式取决于其技术。但是,所有语言都有一些像SOAP这样的HTTP通信方式。或者您可以尝试制作:
两个应用程序都使用socket.io与服务器通信。您可以从以下project中借用代码。

0

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

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

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

虽然涉及一些轮询,但速度非常快,几乎可以忽略不计。使用 NetMsmqBinding 自动实现,所有这些都已经处理好了。您只需要进行配置即可。

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


你将如何从ASP.NET Web应用程序向队列写入信息? - Thomas Stock

0
我不确定,但似乎您的应用程序正在轮询文件系统以打印这些新标签?您考虑过在应用程序中使用FileSystemWatcher吗?您可以设置它来监视一个目录并被通知任何新内容。

感谢您的评论。标签信息存储在服务器上的数据库表中。我需要一种方法让浏览器与应用程序通信,以便告知“有新标签,请下载并打印”。或者让服务器与应用程序通信。 - Lee Taylor
明白了,那么@Shah可能是对的,可以使用MSMQ或其他你选择的队列。 - Prescott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接