2

ChannelFactory生の石鹸リクエストを送信して外部サービスと通信するためにを使用しています。を使用するNetTcpエンドポイントがありますIDuplexSessionChannelIRequestChannel/IRequestSessionChannelusingを作成しようとしましたbinding.BuildChannelFactory<T>()が、機能しませんでした(例外をスローしました)。私がオンラインで読んだことから、デュプレックスチャネルはリクエストチャネルのように使用でき、サービスメソッドを呼び出してすぐに応答を得ることができます。以下のコードがそれを達成するかどうか知りたいです。ChannelFactoryとの例を見るためにどこでも検索しましIDuplexSessionChannelたが、何も見つかりませんでした。最後に、これがIDuplexSessionChannelではなくIDuplexChannelである場合、一方はセッションフルで、もう一方はそうではないため、実装は異なりますか?

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

于 2012-11-06T16:14:36.107 に答える