Отсоедините прокси-классы службы WCF от конечных точек среды - PullRequest
0 голосов
/ 28 июня 2011

Проблема ... У меня есть служба WCF, я не буду тратить чье-то время на копирование / вставку базовой реализации, просто представьте, что это стандартный пример "Эха", который вы видите разбросанным по MSDN.

Допустим, я размещаю сервисную библиотеку с помощью IIS / веб-приложения.Допустим также, что я публикую веб-сайт в разных средах - локальных, совместно используемых серверах разработки, разных тестовых серверах и, конечно же, в разных живых средах.Мы также предположим, что боги WCF улыбнулись нам, и развертывание прошло без проблем =)

Теперь я хочу написать приложение (скажем, приложение WPF для некоторой ясности).Когда приложение запускается, я хочу раскрывающийся список всех доступных сред - я не возражаю против жесткого кодирования или предоставления (с помощью файла конфигурации) этих сред, но слава для ссылок на любые статьи, показывающие обнаружение в локальной сети развернутых служб WCF?^^

Когда пользователь выбрал свою выбранную среду, я хочу, чтобы приложение могло вызывать метод службы (в правильной среде).Теперь я мог бы сделать это с помощью большого оператора выбора case / if, создания экземпляра соответствующего прокси-класса для выбранной среды, вызова с использованием прокси-класса и т. Д. Я даже мог передавать класс от метода к методу в качестве объекта и затем использоватьвыберите операторы case / if вместе с TryCast / DirectCast, чтобы определить, к какой среде относится предоставленный прокси-класс.

Но ... Это ужасно.И должен быть лучший способ.

Я граничу с идеей выбора среды (ни одной, в частности, только одной из них) и с предположением, что все развертывания / среды имеют идентичный код, создавая экземплярпрокси-клиент с подробной информацией о конечной точке выбранной мной среды.Я теряю форму безопасности типов, но это нормально?Это готовый путь?

т.е.

Dim t As Binding = GetDefaultBinding()
' GetCurrentEnvironmentUri() is some function to fetch an endpoint address based on the chosen environment
Dim s As New RandomEnvironment.ProxyClient(t, New EndpointAddress(GetCurrentEnvironmentUri()))

У кого-нибудь была эта проблема?Я предполагаю, что это довольно распространено, мир макетов созрел в наши дни ...

Ответы [ 3 ]

1 голос
/ 28 июня 2011

Вот отличная, углубленная статья о ручном создании собственных прокси WCF:

WCF Ручной путь: правильный путь

Это должно дать вам гибкость, чтобы делать многое из того, что вы ищете.

1 голос
/ 28 июня 2011

Я хочу раскрывающийся список всех доступных сред - я не возражаю против жесткого кодирования или предоставления (посредством файла конфигурации) этих сред, но слава для ссылок на любые статьи, показывающие обнаружение LAN развернутых служб WCF?

Вы можете сделать это, используя WCF Discovery .Это новая функция в .NET 4.0, которая позволяет серверу транслировать свое существование, а также позволяет клиентам отправлять пробное сообщение в ЛВС, спрашивая, какие службы существуют для данного контракта.Пока все сервисы реализуют один и тот же контракт (они могут иметь разные привязки), вы можете использовать обнаружение, чтобы узнать от клиента, какие сервисы могут на него ответить.

1 голос
/ 28 июня 2011

Я думаю, это то, что вы ищете.Далее Wcf.IDataProvider является интерфейсом контракта, и этот метод поддерживает только транспорт net.tcp //, но вы должны иметь возможность параметризовать то, что вам нужно для поддержки http: //.Все, что вам нужно предоставить, это адрес конечной точки:

        ''' <summary>
    ''' Creates a Wcf Proxy for the DataAccess methods
    ''' </summary>
    ''' <param name="p_endpointAddress">Endpoint Address to connect to</param>
    ''' <param name="p_connectTimeout">Connection timeout in seconds</param>
    ''' <param name="p_requestTimeout">Request timeout in seconds</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function CreateWcfDataAccessClient(p_endpointAddress As String, p_connectTimeout As Int32, p_requestTimeout As Int32) As Wcf.IDataProvider
        Dim tempBinding As NetTcpBinding
        Dim tempAddress As EndpointAddress
        Dim tempFactory As ChannelFactory(Of Wcf.IDataProvider)
        Dim tempProxy As Wcf.IDataProvider
        tempBinding = New NetTcpBinding()
        With tempBinding
            ....
        End With
        tempAddress = New EndpointAddress(New Uri(p_endpointAddress), New SpnEndpointIdentity(""))
        With tempAddress

        End With
        tempFactory = New ChannelFactory(Of Wcf.IDataProvider)(tempBinding, tempAddress)
        With tempFactory
        End With
        tempProxy = tempFactory.CreateChannel()
        With tempProxy

        End With
        Return tempProxy

    End Function

Вот контракт на обслуживание:

    <System.ServiceModel.ServiceContract()>
Public Interface IDataProvider

    <System.ServiceModel.OperationContract()>
    Function Execute(ByRef p_request() As Byte, p_useCompression As Boolean) As Byte()
End Interface
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...