【问题标题】:Control Winforms App from Web App从 Web 应用程序控制 Winforms 应用程序
【发布时间】:2010-11-24 05:40:03
【问题描述】:

here之前有人问过类似的问题

...但我的不同之处在于我只需要从网页控制一个winforms应用程序(不是双向的)。当用户单击网络应用程序内的链接时,我只需要告诉 winforms 应用程序打开窗口等。

这一切都在一个安全的企业环境中进行,因此无需担心安全问题。

我看到了 2 个可能的解决方案:

1) 创建一个可以轻松嵌入到网页中的 ActiveX“shim”

2) 在 WinForms 应用程序中托管 WCF 服务,用于侦听(REST-ful 类型)命令

我缺少一个简单的解决方案吗?还有其他选择吗?

【问题讨论】:

  • 是否有多个用户在使用您的 Windows 应用程序?如果是这样,您将需要一个集中式服务来将您的命令分发到每个客户端 Windows 应用程序。

标签: c# winforms web-applications


【解决方案1】:

根据可以从网页向 WinForms 应用程序发出的“命令”的复杂性,您可以简单地向调用您的应用程序的网络浏览器注册一个自定义 URI 方案。例如,mailto: 调用您的电子邮件程序,或者itms: 调用 iTunes Music Store。

然后您的应用程序会识别出它的一个实例已经在运行,并将参数传递给正在运行的实例。

【讨论】:

    【解决方案2】:

    2) 在 WinForms 中托管 WCF 服务 监听的应用程序(REST-ful 类型) 命令

    这太简单了……我会选择这个

    【讨论】:

      【解决方案3】:

      控制winformclients的另一种方法是在网站上添加一个webservice,让你的客户端每2-4秒轮询一次webservice,看看是否存在等待特定客户端执行的命令。

      向数据库中添加一个表 clientid,命令,ClientDone

      当登录的用户单击 Web 应用程序中应该控制 winformclient 的链接时,在表中添加一行,其中包含 clientid 和命令。

      如果客户端在 winform 程序中登录,winform 程序将轮询 web 服务以获取该客户端的新存储命令。当客户端执行命令时,它标记为完成(或者只是从数据库中删除该行)

      这将假定登录网站的用户在登录 winform 程序时具有相同的 clientid/userid。

      【讨论】:

        【解决方案4】:

        由于您处于公司环境中,因此可能使用的浏览器范围非常接近。您是否考虑过编写一个纤薄的 Firefox 插件来与您的网站交互并将所有命令转发到您的 WinForms 应用程序?

        【讨论】:

          【解决方案5】:

          我会为该程序注册一个扩展。你知道,当你点击一个 xls 文件时,它会以 xls 文件的 url 作为参数启动 excel,如果你点击一个播放列表文件,它就会启动你的媒体播放器。

          您可以为(示例)“.fro”文件注册一个扩展名,以 .fro 文件作为参数打开您的程序。

          如果你的程序已经准备好运行,它会获取参数,否则它会启动程序并传递参数。您的程序读取文件并按照文件中的命令进行操作。

          因此,例如,如果您的网络应用程序中有一个链接应该让您的 winform 程序打开客户并显示客户详细信息,那么您可以让您的网络应用程序有一个链接 <a href="opencustomer.fro">Open customer</a>,该文件opencustomer.fro 可以是动态创建的,也可以是静态的。

          1. 注册文件扩展名“.fro”以打开您的 .Net 程序。 (以下示例)

          2. 让网站创建包含命令的 .fro 文件。

          3. 按照本教程 (http://visualstudiomagazine.com/articles/2007/11/01/simplify-application-instancing.aspx) 将您的 .Net 程序制作为单实例应用程序。因此,如果启动了第二个实例,它会通过命名管道将 command$ 发送到第一个实例。

          4. 让您的 .Net 程序下载 .fro 文件并解释文件中的命令。这可能就像只包含要打开的客户编号一样简单。

          我发现了这个关于注册文件类型的 vb.net 示例,它应该不难转换或谷歌 C# 版本:http://bytes.com/topic/net/answers/519230-vb-net-associate-file-program

          Public Class Example 
          
              Public Sub RegisterType() 
                  Dim fileReg As New FileTypeRegistrar 
          
                  With fileReg 
                      .FullPath = Path_To_Executable 
                      .FileExtension = Extension_To_Register 
                      .ContentType = "application/" & Your_Description 
                      .IconIndex = Icon_Index_In_Application 
                      .IconPath = Path_To_Executable 
                      .ProperName = Name_Of_Executable 
                      .CreateType() 
                  End With 
          
              End Sub 
          
          End Class 
          
          Public Class FileTypeRegistrar 
          
          #Region "Properties & Property Variables" 
              Private _ProperName As String 
              Public Property ProperName() As String 
                  Get 
                      Return _ProperName 
                  End Get 
                  Set(ByVal Value As String) 
                      _ProperName = Value 
                  End Set 
              End Property 
          
              Private _ContentType As String 
              Public Property ContentType() As String 
                  Get 
                      Return _ContentType 
                  End Get 
                  Set(ByVal Value As String) 
                      _ContentType = Value 
                  End Set 
              End Property 
          
              Private _FullPath As String 
              Public Property FullPath() As String 
                  Get 
                      Return _FullPath 
                  End Get 
                  Set(ByVal Value As String) 
                      _FullPath = Value 
                  End Set 
              End Property 
          
              Private _FileExtension As String 
              Public Property FileExtension() As String 
                  Get 
                      Return _FileExtension 
                  End Get 
                  Set(ByVal Value As String) 
                      _FileExtension = Value.Replace(".", "") 
                  End Set 
              End Property 
          
              Private _IconPath As String 
              Public Property IconPath() As String 
                  Get 
                      Return _IconPath 
                  End Get 
                  Set(ByVal Value As String) 
                      _IconPath = Value 
                  End Set 
              End Property 
          
              Private _IconIndex As Integer 
              Public Property IconIndex() As Integer 
                  Get 
                      Return _IconIndex 
                  End Get 
                  Set(ByVal Value As Integer) 
                      _IconIndex = Value 
                  End Set 
              End Property 
          #End Region 
          
          #Region "Public Methods" 
              Public Sub CreateType() 
                  Dim fileName As String = Path.GetFileNameWithoutExtension(FullPath) 
                  Dim Ext As String = "." & FileExtension.ToLower 
                  Dim extKey As RegistryKey = Registry.ClassesRoot.CreateSubKey(Ext) 
          
                  extKey.SetValue("", fileName) 
                  extKey.SetValue("Content Type", ContentType) 
                  extKey.Close() 
          
                  Dim mainKey As RegistryKey = Registry.ClassesRoot.CreateSubKey(fileName) 
                  Dim defIconKey As RegistryKey = mainKey.CreateSubKey("DefaultIcon") 
          
                  defIconKey.SetValue("", IconPath & ", " & IconIndex) 
                  defIconKey.Close() 
          
                  Dim shellKey As RegistryKey = mainKey.CreateSubKey("shell") 
                  Dim OpenKey As RegistryKey = shellKey.CreateSubKey("Open") 
                  Dim cmdKey As RegistryKey = OpenKey.CreateSubKey("command") 
          
                  cmdKey.SetValue("", """" & FullPath & " %1""") 
                  cmdKey.Close() 
                  OpenKey.Close() 
                  shellKey.Close() 
                  mainKey.Close() 
          
              End Sub 
          
              Public Sub DeleteType() 
                  Dim fileName As String = Path.GetFileNameWithoutExtension(FullPath) 
                  Dim Ext As String = "." & FileExtension.ToLower 
          
                  Registry.ClassesRoot.DeleteSubKey(Ext) 
                  Registry.ClassesRoot.DeleteSubKey(fileName) 
          
              End Sub 
          #End Region 
          
          End Class 
          

          【讨论】:

            猜你喜欢
            • 2015-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多