从DuplexChannelFactory <t>中未调用类型的构造函数

时间:2015-11-18 13:26:49

标签: c# wcf

我对here中的文章有疑问。相关代码如下。

    public CustomClientChannel(string configurationPath) : base(typeof(T))
    {
        this.configurationPath = configurationPath;
        base.InitializeEndpoint((string)null, null);
    }

    protected override ServiceEndpoint CreateDescription()
    {

        ServiceEndpoint serviceEndpoint = base.CreateDescription();
        ExeConfigurationFileMap map = new ExeConfigurationFileMap();
        map.ExeConfigFilename = this.configurationPath;
        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
        ServiceModelSectionGroup group = ServiceModelSectionGroup.GetSectionGroup(config);
        ChannelEndpointElement selectedEndpoint = null;
        ......
    }

第一个函数是类的构造函数,第二个函数重载DuplexChannelFactory中的CreateDescription函数,因为该类不属于DuplexChannelFactory。

但是,当我使用此类创建对象时,代码直接运行到CreateDescription()中。

因此,即使我将configurationPath传递给构造函数,this.configurationPath仍为null。

如果我是ChannelFactory固有的CustomClientChannel类,那么它工作正常。

请帮助查看错误,ChannelFactory和DuplexChannelFactory有什么区别?我正在使用netTcpBinding。谢谢。

2 个答案:

答案 0 :(得分:1)

您的构造函数正在调用一个采用单一类型的基础构造函数。

 : base(typeof(T))

ChannelFactory<T>DuplexChannelFactory<T>都实现了一个受保护的构造函数,它只采用一种类型,但它们不同

ChannelFactory<T>想要频道类型。

DuplexChannelFactory<T>想要回调实例类型

换句话说,它们完全不同,可以有完全不同的代码路径。受保护的构造函数仅由派生类型使用,并且通常推断出类层次结构如何工作的某种程度的知识。

您最好选择通常使用的 public 构造函数,然后调用它。如果那是不可能的,那么你需要找出适当的DuplexChannelFactory构造函数来调用。

答案 1 :(得分:0)

让我们从

开始
  

ChannelFactory和。之间的区别是什么?   DuplexChannelFactory?

首先,有必要了解WCF中simplex and duplex通信之间的区别。

单工连接就像发送短信然后接收发送通知一样 - 即使在较低的传输级别,您的手机和运营商之间可能会有多次通话,从通信级别开始,您正在发送短信只有一个方向。

双工连接就像拨打电话一样,您可以向运营商发送语音数据,您的运营商可以同时向另一个方向发送语音数据。这需要在两个方向上打开单工通道。

ChannelFactory和DuplexChannelFactory都可用于创建服务的客户端通道。

您选择哪一个取决于您所呼叫的服务是否公开单工或双工服务操作,以及您作为消费者是否需要使用这些操作。

如果服务公开正常(即单工)操作,例如:

void DoCoSomething(int x);

List<Things> GetThings();

等...

...然后你可以使用ChannelFactory来使用这些操作。

如果服务公开callback contract

public interface IMyDuplexCallback
{
    [OperationContract(IsOneWay = true)]
    void NotifyMeOf(string message);
}
例如,为了向消费者发送某种通知或消息,并且您作为消费者想要利用这一点,您可以使用DuplexChannelFactory来调用该服务(在您的客户端上实现回调合同之后)当然)。

作为一般规则,WCF中的双工通信最多是复杂的,因此最好避免。

感谢这不能解决您的原始问题。