当我调用动态ChannelFactory
时,我在服务上遇到了ihneritance的问题。
我的项目结构:
我有一个类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
的所有ServiceBase
ihnerit并实施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
类中声明的另一个方法正在工作,当我在Ping
服务上使用Client Test WCF时,方法IFoo
运行良好。
所以这意味着ChannelFactory
的动态创建是个问题,但我不知道如何做到这一点。
编辑:答案可以在C#中翻译,并且可以在C#中给出答案
感谢您的帮助。
答案 0 :(得分:0)
试试这个。我假设myInterfaceType是实现IServiceBase的接口,value是WCF配置中的端点名称
class Program
{
static void Main(string[] args)
{
var factoryType = typeof(MyChannelFactory).GetMethod("CreateProxyChannel", BindingFlags.Static | BindingFlags.Public);
var generic = factoryType.MakeGenericMethod(myInterfaceType);
var result = generic.Invoke(null, new[] { value});
var channel = (IServiceBase) result;
var check = channel.Ping();
}
}
class MyChannelFactory
{
public static T CreateProxyChannel<T>(string endpointName)
{
ChannelFactory<T> factory = new ChannelFactory<T>(endpointName);
return factory.CreateChannel();
}
}