我在我的托管应用程序中使用 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 通道。
我正在处理的问题,我需要在每次调用时打开/关闭通道,我不想在每次调用时重新创建整个 ServiceClient 包装器,因为使用这些绑定创建 ChannelFactory 的成本。我只想打开。关闭频道。
我可不可以做:
((IChannel)_channel).Close();
((IChannel)_channel).Open();
每次手术前?或者我需要这样做:
((IChannel)_channel).Close();
_channel = _channelFactory.CreateChannel();
为了重新创建频道?
我认为最好的解决方案是在我的包装器中创建一个公共函数作为https://stackoverflow.com/a/573877/1426106中的示例