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

Posted

技术标签:

【中文标题】与 Windows 应用程序的客户端通信【英文标题】:Client side communication with Windows application 【发布时间】:2012-07-21 17:36:37 【问题描述】:

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

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

问题:

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

轮询过程提取的数据并不庞大,但我担心随着我们添加更多的拣选/打包站,轮询过程可能会对网络服务器/数据库产生连锁反应(因为所有站将进行投票)。此外,拣货员/包装员不想等待标签,因此不可能延长轮询时间(如果有什么我想尽快)

解决方案?

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

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

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

我希望这很清楚,不要太罗嗦。让我知道我是否可以在此处添加任何其他详细信息。提前致谢。

编辑

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

更新

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

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

【问题讨论】:

不确定这个解决方案...但 SignalR 是否是一种可行的工具,可以将更新从 Web 服务器“推送”到本地计算机? 嗨@RichardB 感谢您的回复。我暂时让代码使用轮询解决方案运行。客户正在转向另一个解决方案,因此这不再是一个问题。不过我会研究一下,因为在工具箱中有另一个工具总是有用的! 【参考方案1】:

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

不过,我不确定这是否是您所需要的。正如我所见,您需要将图形数据传递给您的应用程序,仅使用 javascript 可能会非常棘手。

【讨论】:

不用担心图形数据。我唯一需要的是浏览器能够告诉应用程序有 1 个或多个标签需要打印。其余的都完成了。【参考方案2】:

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

您可以获取任何网络服务器(例如,node.js nodejs.org,这将使您可以使用与服务器上的网络应用程序相同的 JavaScript)并与之交互。您如何从桌面应用程序与服务器对话取决于其技术。然而,所有语言都有一些方法来进行 http 通信,如SOAP

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

【讨论】:

【参考方案3】:

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

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

我提到队列的原因是为了可靠性,如果您的 Windows 应用程序因任何原因出现故障,队列至少会被保留并等待您恢复 Windows 应用程序。

虽然涉及一些轮询,但它非常快速且几乎可以忽略不计。使用 NetMsmqBinding 实现它是自动的,这一切都得到了照顾。您需要做的就是配置它。

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

【讨论】:

你将如何将信息从 asp.net web 应用程序写入队列?【参考方案4】:

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

【讨论】:

感谢您的评论。标签信息存储在服务器上的数据库表中。我需要一种让浏览器与应用程序通信的方法,以说“有一个新标签,下载并打印它”。或者让服务器与应用程序通信。 知道了,在这种情况下,@Shah 可能对 MSMQ 或您选择的其他队列正确。

以上是关于与 Windows 应用程序的客户端通信的主要内容,如果未能解决你的问题,请参考以下文章

使用 DELPHI 与 Windows 上的两个应用程序通信

从客户端 Web 浏览器与串行端口通信。

在电子应用程序中实现socket.io,它与本地Web服务器通信

Memcached介绍与windows环境安装

使用 SERVICE_USER_DEFINED_CONTROL 与 Windows 服务通信

c# Windows 服务的客户端/服务器(服务)通信