从Web App控制Winforms App

时间:2009-08-31 01:38:13

标签: c# winforms web-applications

here

之前已经提出了类似的问题

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

这一切都在一个安全的企业环境中,因此不必担心安全问题。

我看到了两种可能的解决方案:

1)创建一个ActiveX“shim”,可以很容易地嵌入到网页中

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

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

5 个答案:

答案 0 :(得分:1)

根据可以从网页发布到WinForms应用程序的“命令”的复杂性,您只需使用调用应用程序的Web浏览器注册自定义URI方案即可。例如,mailto:调用您的电子邮件程序,或itms:调用iTunes音乐商店。

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

答案 1 :(得分:0)

我会为该计划注册一个扩展程序。你知道,当你点击一个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程序转换为单实例应用程序。因此,如果启动了第二个实例,它会通过命名管道将命令$发送到第一个实例。

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

  5. 我发现这个关于注册文件类型的vb.net示例,它应该不难转换或谷歌C#-version: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 
    

答案 2 :(得分:0)

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

将表添加到数据库中 clientid,命令,ClientDone

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

  

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

这很简单......我选择了这个