在从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。非常感谢。
您的构造函数正在调用一个采用单一类型的基构造函数。
: 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中的双工通信充其量是复杂的,因此最好避免。
感谢这并没有解决你最初的问题。