我对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。谢谢。
答案 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中的双工通信最多是复杂的,因此最好避免。
感谢这不能解决您的原始问题。