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

时间:2010-08-03 13:41:54

标签: c# asp.net

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

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

6 个答案:

答案 0 :(得分:2)

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

你可以使用WCF或Remoting或套接字 - 为什么浪费时间学习曲线要​​高得多?创建Web服务将花费时间,并且应该为您提供所需的所有功能。

这是一个简短的演练,帮助您开始运行。

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

    [的WebMethod]

    公共字符串HelloWorld(){

    return "Hello World";
    

    }

  3. 运行您的网站。

  4. 转到桌面应用程序。
  5. 在您的解决方案资源管理器下,右键单击该项目,然后单击添加Web参考
  6. 输入运行Web服务的位置的URL,然后单击Go **
  7. 找到您的参考后,将其重命名为有意义的内容,然后点击添加参考。
  8. 您现在可以访问Web服务公开的方法,就像它们是本地对象一样。您现在应该能够看到该服务公开的HelloWorld方法。
  9. **请记住,为了让您拥有带静态URL的Web引用,您需要在IIS中托管引用。当Visual Studio从IDE运行您的服务时,它将创建一个临时URL和端口,该端口将在将来运行时更改。这只是为了向您展示使用Web服务的简单程度。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

让您的Windows应用程序拥有自托管的Web服务,并在用户单击按钮时从您的Web应用程序调用此Web服务。参见例如here关于如何做到这一点。这真的很容易,也很容易,imho。

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

答案 5 :(得分:0)

与往常一样,猫的皮肤不止一种方法。以下是我的看法。

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

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

潜在地使用Reactive Extension进行.Net可以在这里提供帮助。 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 service