问题...我有一个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()))
有人有这个问题吗?我认为这是相当普遍的,这些天模拟世界已经成熟......
答案 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)
答案 2 :(得分:1)
我想要一个下拉列表列出所有可用的环境 - 我不介意硬编码或提供(通过配置文件)这些环境,但是赞扬链接任何显示部署的WCF服务的LAN发现的文章?
您可以使用WCF Discovery执行此操作。这是.NET 4.0中的一项新功能,它允许服务器广播它的存在,并且还允许客户端向LAN发送探测消息,询问给定合同存在哪些服务。只要所有服务实现相同的合同(它们可以具有不同的绑定),那么您可以使用发现从客户端查找哪些服务可以响应它。