2012-11-05 64 views
2

我使用ChannelFactory通过发送原始soap请求与外部服务进行通信。我有一个使用IDuplexSessionChannel的NetTcp端点。我尝试使用binding.BuildChannelFactory<T>()创建一个IRequestChannel/IRequestSessionChannel,但那不起作用(抛出异常)。从我在线阅读的内容来看,双工频道可以像请求频道一样使用,您可以在其中调用服务方法并获得即时响应。我想知道下面的代码是否可以实现这一点。我到处搜索以查看ChannelFactoryIDuplexSessionChannel的示例,但找不到任何内容。最后,如果这是一个IDuplexChannel而不是一个IDuplexSessionChannel,那么这个实现是否会有所不同,因为一个是会话式的,另一个不是?WCF ChannelFactory IDuplexSessionChannel

IChannelFactory factory; 
IChannel  channel; 

Binding   binding = GetBindingFromConfig(bindingName); 
EndpointAddress address = new EndpointAddress(endpointAddress); 

if(binding.CanBuildChannelFactory<IDuplexSessionChannel>()) 
{ 
    factory = binding.BuildChannelFactory<IDuplexSessionChannel>(); 
    factory.Open(); 
    channel = ((IChannelFactory<IDuplexSessionChannel>)factory).CreateChannel(address); 
    channel.Open(); 

    ((IDuplexSessionChannel)channel).Send(requestMessage); 
    ((IDuplexSessionChannel)channel).TryReceive(Timespan.MaxValue, out responseMessage); 
} 

这里是我的配置文件:

<netTcpBinding> 
    <binding 
     name="xyz" 
     closeTimeout="00:01:00" 
     openTimeout="00:01:00" 
     receiveTimeout="00:10:00" 
     sendTimeout="00:01:00" 
     transactionFlow="false" 
     transferMode="Buffered" 
     transactionProtocol="OleTransactions" 
     hostNameComparisonMode="StrongWildcard" 
     listenBacklog="10" 
     maxBufferPoolSize="524288" 
     maxBufferSize="10485760" 
     maxConnections="10" 
     maxReceivedMessageSize="10485760"> 

     <readerQuotas 
      maxDepth="32" 
      maxStringContentLength="8192" 
      maxArrayLength="10485760" 
      maxBytesPerRead="4096" 
      maxNameTableCharCount="16384" /> 

     <reliableSession 
      ordered="true" 
      inactivityTimeout="00:10:00" 
      enabled="false" /> 

     <security mode="Transport" /> 
    </binding> 
</netTcpBinding> 
+0

你说扔一个例外 - 它扔了什么,在哪里? – Chris

+0

在binding.BuildChannelFactory ()处引发。 ArgumentException:此通道管理器不支持指定的通道类型System.ServiceModel.Channels.IRequestChannel。参数名称:TChannel。 – fbhdev

回答

0

我找到了一种方法来解决这个问题,那就是:

ChannelFactory<IRequestChannel> factory; 
IRequestChannel     channel; 

Binding   binding = GetBindingFromConfig(bindingName); 
EndpointAddress address = new EndpointAddress(endpointAddress); 

factory = new ChannelFactory<IRequestChannel>(binding, address); 

// Since this endpoint uses sessions, we have to allow sessions to prevent an exception. 
factory.Endpoint.Contract.SessionMode = SessionMode.Allowed; 

factory.Open(); 
channel = factory.CreateChannel(address); 
channel.Open(); 

responseMessage = channel.Request(requestMessage); 

学分:http://blogs.msdn.com/b/drnick/archive/2007/06/25/changing-the-channelfactory-contract.aspx

相关问题