从环境端点中分离WCF服务代理类

时间:2011-06-28 15:33:20

标签: vb.net wcf visual-studio-2010 .net-4.0 mocking

问题...我有一个WCF服务,我不会浪费任何人的时间来复制/粘贴一个基本的实现,只是想象它是你看到分散在MSDN周围的标准“Echo”示例。

假设我使用IIS / Web应用程序托管服务库。我们还说我将网站发布到不同的环境 - 本地,共享开发服务器,不同的测试服务器,当然还有不同的实时环境。我们还假设WCF神对我们微笑,部署顺利进行=)

现在我想写一个应用程序(为了清楚起见,让我们说WPF应用程序)。当应用程序启动时,我想要一个下拉列表列出所有可用的环境 - 我不介意硬编码或提供(通过配置文件)这些环境,但是赞赏链接任何显示部署的WCF服务的LAN发现的文章? ^^

当用户选择了他们选择的环境时,我希望应用程序能够在服务上调用方法(在正确的环境中)。现在我可以使用一个大的select 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 个答案:

答案 0 :(得分:1)

我认为这就是你要找的东西。在下面,Wcf.IDataProvider是契约接口,此方法仅支持net.tcp // transport,但您应该能够参数化支持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

答案 1 :(得分:1)

这是一篇非常好的,深入的文章,主要是关于手动创建自己的WCF代理:

WCF the Manual Way: The Right Way

这可以让您灵活地执行您正在寻找的许多内容。

答案 2 :(得分:1)

  

我想要一个下拉列表列出所有可用的环境 - 我不介意硬编码或提供(通过配置文件)这些环境,但是赞扬链接任何显示部署的WCF服务的LAN发现的文章?

您可以使用WCF Discovery执行此操作。这是.NET 4.0中的一项新功能,它允许服务器广播它的存在,并且还允许客户端向LAN发送探测消息,询问给定合同存在哪些服务。只要所有服务实现相同的合同(它们可以具有不同的绑定),那么您可以使用发现从客户端查找哪些服务可以响应它。