【发布时间】:2016-10-21 23:02:45
【问题描述】:
当我调用动态ChannelFactory 时,我遇到了关于服务方面的问题。
我的项目结构:
我有一个类 ServiceBase 和一个接口 IServiceBase,用于所有 WCF 服务和合同(2 个单独的项目)。
IServiceBase
Imports System.ServiceModel
<ServiceContract()>
Public Interface IServiceBase
''' <summary>
''' Ping.
''' </summary>
''' <returns>Vrai.</returns>
<OperationContract()>
Function Ping() As Boolean
End Interface
ServiceBase
Public Class ServiceBase
Implements IDisposable, IServiceBase
#Region "IServiceBase"
''' <summary>
''' Ping.
''' </summary>
''' <returns>
''' Vrai.
''' </returns>
Public Function Ping() As Boolean Implements IServiceBase.Ping
Return True
End Function
#End Region
End Class
所有IFoo 都继承自IServiceBase。
所有Foo ihnerit 来自ServiceBase 并实现IFoo。
我有一个 TestController(客户端),它加载所有合约程序集以解析它是否处于活动状态。
所以我按照我的一份合同的类型进行组装(运作良好)
Dim common As Assembly = Assembly.GetAssembly(GetType(Firma.Project.Services.Contracts.ICommon))
对于它们中的每一个,我确定它是否是一个接口以及它是否从IServiceBase 派生(运行良好,但仅适用于IsAssignableFrom、GetMethod 不要从派生接口返回Ping(仅适用于类))。
For Each ty As Type In common.GetTypes
If ty.IsInterface AndAlso GetType(IServiceBase).IsAssignableFrom(ty) Then
Try
Dim myInterfaceType As Type = ty
Dim value As String = String.Empty
If Not _dicEndPoints.TryGetValue(ty.FullName, value) Then
Continue For
End If
由此,我动态创建了我的频道(似乎工作正常,我在调试步骤中看到了 ChannelFactory<IFoo>(endpointname))
' Type ChannelFactory<>.
Dim factoryType = GetType(ChannelFactory(Of )).MakeGenericType(myInterfaceType)
' Constructeur ChannelFactory<IFoo>(endpointname)
Dim factoryCtr = factoryType.GetConstructor(New Type() {GetType(String)})
' Invoke dynamic ChannelFactory<IFoo>(endpointname)
Dim factory = factoryCtr.Invoke(New Object() {value})
' dynamic Create Channel
Dim channel = factory.CreateChannel()
但是当我调用方法Ping时,它不起作用
Dim retour As Object = channel.Ping()
我有“找不到公共方法 Ping”。
在Foo 类中直接声明的另一种方法正在运行,当我在IFoo 服务上使用客户端测试WCF 时,Ping 方法运行良好。
所以这意味着ChannelFactory 的动态创建是问题所在,但我不知道如何做到这一点。
编辑:可以用 C# 翻译答案,可以用 C# 给出响应
感谢您的帮助。
【问题讨论】:
-
也许我的问题不是很清楚?
-
或者VB.Net烧开发者的眼睛:)
-
您是否尝试过这样创建工厂:Dim factoryCtr As ChannelFactory(Of IFoo) = New ChannelFactory(Of IFoo)?另外,也许您在创建通道时必须提供更多信息,例如 Endpoint 和 Behavior。
-
我不能声明 ChannelFactory(Of myInterfaceType)。如果没有,那会更容易:)
标签: c# .net vb.net wcf inheritance