1

マネージド アプリケーションで WCF インフラを使用しています。
次のようなクライアント用のラッパー クラスがあります。

public class ServiceClient<TService> 
    where TService : class
{
    private TService _channel;
    private ChannelFactory<TService> _channelFactory;
    private readonly object _syncLock = new object();
    private readonly Binding _binding;
    private readonly string _uri;

//I have sets of constructors, i get the endpoint and binding type for each client in constructing.

    public TService Channel { get { Initiliaze(); return _channel;  } }

    private void Initiliaze()
    {
        lock (_syncLock)
        {
            if (_channel != null) return;

            //Create channel factory with binding and address
            _channelFactory = new ChannelFactory<TService>(_binding,_uri);

            //add additional behaviors if they exist
            if (_applyDefaultBehavior)
            {
                _channelFactory.Endpoint.Behaviors.Add(new ClientEndpointBehavior<TService>(_container));
            }

            //register client on channel events
            _channelFactory.Opened += OnChannelFactoryOpened;
            _channelFactory.Closed += OnChannelFactoryClosed;
            _channelFactory.Faulted += OnChannelFactoryFaulted;

            _channel = _channelFactory.CreateChannel(); 
        }
    }

残りは Dispose であり、現在はそれほど重要ではありません。

これまで私は ServiceClient を使用していました - 私は using ( .. ServiceClient ...) を使用しませんでしたが、WCF チャネルを開いたり閉じたりしませんでした。

私が扱っている問題は、呼び出しごとにチャネルを開閉する必要があることです。これらのバインディングを使用して ChannelFactory を作成するコストがかかるため、呼び出しごとに ServiceClient ラッパー全体を再作成したくありません。チャンネルを開閉したいだけです。

僕にできる:

((IChannel)_channel).Close();
((IChannel)_channel).Open();

各操作の前に? または私はする必要があります:

((IChannel)_channel).Close();
_channel = _channelFactory.CreateChannel(); 

チャネルを再作成するには ? 最善の解決策は、 https://stackoverflow.com/a/573877/1426106
のサンプルとしてラッパーでパブリック関数を作成することだと思います

4

0 に答える 0