在从DuplexChannelFactory派生的类型中未调用构造函数<;T>;

本文关键字:构造函数 gt lt 调用 派生 DuplexChannelFactory 类型 在从 | 更新日期: 2023-09-27 18:22:20

我对这里的文章有疑问。相关代码如下。

    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函数,因为该类是从DuplexCannelFactory继承的。

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

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

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

请帮助查看哪里出了问题,ChannelFactory和DuplexChannelFactory之间有什么区别?我正在使用netTcpBinding。非常感谢。

在从DuplexChannelFactory派生的类型中未调用构造函数<;T>;

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

 : base(typeof(T))

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

ChannelFactory<T>想要通道类型。

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

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

您最好选择通常使用的公共构造函数,然后调用它。如果这不可能,那么您需要找到合适的DuplexChannelFactory构造函数来调用。

让我们从开始

ChannelFactory和双工信道工厂?

首先,有必要了解WCF中单工通信和双工通信之间的区别。

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

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

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

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

如果服务暴露正常(即单纯形)操作,例如:

void DoCoSomething(int x);
List<Things> GetThings();

等等。。。

则可以使用ChannelFactory使用这些操作。

如果服务公开回调合约:

public interface IMyDuplexCallback
{
    [OperationContract(IsOneWay = true)]
    void NotifyMeOf(string message);
}

例如,为了向消费者发送某种通知或消息,而你作为消费者想要利用这一点,你可以使用DuplexChannelFactory来调用服务(当然是在你的客户端上实现回调合约之后)。

一般来说,WCF中的双工通信充其量是复杂的,因此最好避免。

感谢这并没有解决你最初的问题。