Control Winforms App из веб-приложения - PullRequest
3 голосов
/ 31 августа 2009

Подобный вопрос задавался раньше здесь

... но мое отличается тем, что мне просто нужно управлять приложением winforms с веб-страницы (не двунаправленной). Мне просто нужно сказать приложению winforms открывать окна и т. Д., Когда пользователь щелкает ссылки внутри веб-приложения.

Все это в защищенной корпоративной среде, поэтому не стоит беспокоиться о безопасности.

Я вижу 2 возможных решения:

1) создать ActiveX «прокладку», которую можно легко встроить в веб-страницу

2) разместить службу WCF в приложении WinForms, которая прослушивает команды (тип REST-ful)

Есть ли какое-то мертвое простое решение, которого мне не хватает? Есть ли другие альтернативы?

Ответы [ 5 ]

1 голос
/ 31 августа 2009

В зависимости от сложности «команд», которые могут быть переданы с веб-страницы в приложение WinForms, вы можете просто зарегистрировать пользовательскую схему URI в веб-браузере, который вызывает ваше приложение. Как, например, mailto: вызывает вашу почтовую программу или itms: вызывает iTunes Music Store.

Тогда ваше приложение распознает, что его экземпляр уже запущен, и передаст аргументы запущенному экземпляру.

0 голосов
/ 31 августа 2009

2) разместить службу WCF в WinForms приложение, которое слушает (REST-фул тип) команды

это чертовски просто ... Я бы выбрал это

0 голосов
/ 31 августа 2009

Поскольку вы находитесь в корпоративной среде, возможно, используется очень ограниченное количество браузеров. Задумывались ли вы о создании тонкого дополнения Firefox, которое взаимодействует с вашим сайтом и передает все команды в ваше приложение WinForms?

0 голосов
/ 31 августа 2009

Другим способом управления winformclients будет добавление веб-службы на веб-сайт, и пусть ваши клиенты будут опрашивать веб-службу каждые 2-4 секунды, чтобы определить, существует ли команда ожидания для конкретного клиента.

Добавьте таблицу в базу данных клиентов, команду ClientDone

И когда вошедший в систему пользователь нажимает на ссылку в веб-приложении, которая должна контролировать winformclient, добавьте в таблицу строку с клиентом и коммандой.

Если клиент вошел в программу winform, программа winform запросит веб-сервис о новых сохраненных командах для этого клиента.Когда клиент выполнил команду, он помечается как выполненный (или просто удаляется строка из базы данных)

Это будет предполагать, что пользователь, вошедший в систему на веб-сайте, имеет тот же клиентский идентификатор / идентификатор пользователя при входе в программу winform.

0 голосов
/ 31 августа 2009

Я бы зарегистрировал расширение для программы. Знаете, когда вы щелкаете по xls-файлу, он начинает работать с URL-адресом xls-файла в качестве параметра, а если вы щелкаете по файлу списка воспроизведения, он запускает ваш медиаплеер.

Вы можете зарегистрировать расширение (например) ".fro" -файлов, которое открывает вашу программу с .fro-файлом в качестве параметра.

Если ваша программа уже запущена, она получает параметр или запускает программу и передает параметр. Ваша программа читает файл и выполняет команды в файле.

Так, например, если у вас есть ссылка в вашем веб-приложении, которая должна сделать вашу winform-программу для открытия клиента и отображения сведений о клиенте, вы сделаете так, чтобы ваше веб-приложение имело ссылку <a href="opencustomer.fro">Open customer</a>, файл opencustomer.fro может быть создан динамически или статически.

  1. Зарегистрируйте расширение файла ".fro", чтобы открыть вашу программу .Net. (пример следующий)

  2. Заставить сайт создавать .fro-файлы с командами в них.

  3. Превратите вашу программу .Net в приложение одного экземпляра, следуя этому руководству (http://visualstudiomagazine.com/articles/2007/11/01/simplify-application-instancing.aspx) Поэтому, если запускается второй экземпляр, он отправляет команду $ первому экземпляру через именованные каналы.

  4. Заставьте вашу .Net-программу загрузить .fro-файл и интерпретировать команду в файле. Это может быть так просто, как просто указать номер клиента, который нужно открыть.

Я нашел этот пример на vb.net о типах файлов реестра, его не должно быть сложно конвертировать или Google 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...