2

我正在使用 aChannelFactory通过发送原始肥皂请求与外部服务进行通信。我有一个使用IDuplexSessionChannel. 我尝试创建一个IRequestChannel/IRequestSessionChannelusing binding.BuildChannelFactory<T>(),但这不起作用(抛出异常)。从我在线阅读的内容来看,双工通道可以像请求通道一样使用,您可以在其中调用服务方法并立即获得响应。我想知道下面的代码是否实现了这一点。ChannelFactory我到处搜索以查看and的示例IDuplexSessionChannel,但找不到任何东西。最后,如果这是一个 IDuplexChannel 而不是 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>
4

1 回答 1

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/changeing-the-channelfactory-contract.aspx

于 2012-11-06T16:14:36.107 回答