如何让我的Web应用程序与我的桌面应用程序通信?

我在C#.NET中开发了一个Web和Windows应用程序。 现在,我想要做的是当在Web应用程序中的特定页面上单击按钮时,必须将信号发送到Windows应用程序,表示已单击链接。 我怎么能这么容易地做到这一点? 我想远离套接字编程……

我想到了存储cookie的网络应用程序和监控cookies文件夹的桌面应用程序,但这看起来有点笨拙。

桌面应用程序可以通过普通的http来浏览Web应用程序,但是打开连接可能会更好。 您还可以使用.NET remoting或WCF之类的东西来启用IPC类型的通信。

您还可以查看IPC的命名管道。

一个简单的Web服务应该可以解决问题。 只需在ASP.NET中创建一个服务,并将其添加为对桌面应用程序的引用。 没有必要过度杀死来完成这么简单的任务。

您可以使用WCF或Remoting或套接字 – 为什么浪费时间学习曲线如此之高? 创建Web服务将花费时间,并且应该为您提供所需的所有function。

这是一个简短的演练,帮助您了解并运行。

  1. 在Visual Studio中,创建一个新网站并选择“ASP.NET Web服务”。
  2. 将创建一个名为HelloWorld的存根方法,例如

    [的WebMethod]

    public string HelloWorld(){

    return "Hello World"; 

    }

  3. 运行您的网站。

  4. 转到桌面应用程序。
  5. 在解决方案资源管理器下,右键单击该项目,然后单击“添加Web引用”
  6. 输入运行Web服务的URL,然后单击Go **
  7. 找到引用后,将其重命名为有意义的内容,然后单击“添加引用”。
  8. 您现在可以访问Web服务公开的方法,就像它们是本地对象一样。 您现在应该能够看到该服务公开的HelloWorld方法。

**请记住,为了使用静态URL进行Web引用,您需要在IIS中托管引用。 当Visual Studio从IDE运行您的服务时,它将创建一个临时URL和端口,该端口将在将来运行时更改。 这只是为了向您展示使用Web服务是多么简单。

您可以通过在方法上方添加[WebMethod]标志,在与HelloWorld方法相同的类中添加自己的方法和返回类型。 如果您更改了服务中的某些内容,请返回桌面应用程序,右键单击该服务,然后单击“更新”。

您可以使用.NET远程处理来完成此类任务。 这意味着桌面客户端必须启动.NET远程服务器,以便Web服务器可以调用桌面客户​​端的方法。

但这可能会带来安全风险。 此外,路由器或防火墙可能会阻止对客户端的访问。 也许最好使用轮询,即桌面客户端定期向服务器查询新事件。 为此,一个简单的REST-API就足够了,虽然这里也可以使用.NET远程处理(以及SOAP或CORBA)。

可能与cookie的想法一样笨拙,但Web应用程序可以存储有关被点击的链接的信息(何时,由谁,页面上的控件值等)并将其存储在客户端应用程序定期轮询的数据库中。

让您的Windows应用程序拥有自托管的Web服务,并在用户单击按钮时从您的Web应用程序调用此Web服务。 请参阅此处有关如何执行此操作的信息。 imho,这真的很容易,也很容易。

(你不需要套接字……好吧,在这个解决方案中深深埋藏了套接字,但是到目前为止,所有解决方案中都有一些来自命名管道和共享文件的部分,但这些都有严重的不利因素。无论如何,你不会被这些sockets困扰,它们由框架照顾,不用担心。)

一如既往,有不止一种方法可以给猫皮肤涂抹。 以下是我的看法。

如果您不需要即时响应,但需要可扩展性来支持很多桌面客户端

click可以简单地表现为“命令总线”中的事件 (读取: 事件聚合器 )。 命令总线中的项目通过Web服务公开。 桌面应用程序然后可以通过轮询Web服务简单地“观察”命令总线,如果有一个它以前没有见过的新“命令”。

可能使用.Net的Reactive Extension可以在这里提供帮助。 Web公开IObservable,桌面客户端成为IObserver

如果您需要更快速的响应,但只有有限数量的桌面客户端,并且每个客户端都有永久IP地址

在桌面客户端中托管wcf服务。 使用net tcp将此绑定到您的公共IP地址(例如net.tcp://xxx.xxx.xxx.xxx:8523 / Service1)。 当用户单击网站上的按钮时,网站将向您的桌面客户端中托管的wcf服务发送请求。 这个细节对我来说非常模糊,但似乎是一种合乎逻辑的方法。

如果您需要更快速的响应,但只有有限数量的桌面客户端,并且每个客户端都没有永久IP地址,并且愿意为云服务付费这里Azure Service Bus可能会派上用场。 每次用户单击链接时,都会将消息推送到Azure Service Bus。 每个桌面客户端都可以订阅Azure Service Bus中的事件。 这是Azure服务的示例