【问题标题】:Wcf inherit and dynamic CreateChannelwcf继承和动态CreateChannel
【发布时间】: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 派生(运行良好,但仅适用于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&lt;IFoo&gt;(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


【解决方案1】:

试试这个。我假设 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();
    }
}

【讨论】:

  • 当我投射到 IServiceBase 时它正在工作。所以这对我需要的行为有好处。但我一直在问为什么我在动态调用中看不到基本方法(显式转换为 IFoo 不返回基本方法)。
  • 显式转换为 IFoo 也可以,因为 IFoo 实现了 IServiceBase
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多