2012-11-05 3 views
2

Я использую ChannelFactory для связи с внешними службами путем отправки необработанных мыльных запросов. У меня есть конечная точка NetTcp, которая использует IDuplexSessionChannel. Я попытался создать IRequestChannel/IRequestSessionChannel, используя binding.BuildChannelFactory<T>(), но это не сработало (выбрало исключение). Из того, что я читаю онлайн, дуплексные каналы могут использоваться как каналы запросов, где вы вызываете метод услуги и получаете немедленный ответ. Я хочу знать, выполнит ли этот код ниже. Я искал повсюду, чтобы увидеть пример ChannelFactory и IDuplexSessionChannel, но ничего не смог найти. Наконец, если это был 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

Броски при перепроверке.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

Смежные вопросы