Wcf继承和动态CreateChannel

时间:2016-06-20 15:52:18

标签: c# .net vb.net wcf inheritance

当我调用动态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(运作良好,但只有IsAssignableFromGetMethod不返回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#中给出答案

感谢您的帮助。

1 个答案:

答案 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();
    }
}