| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using Aitex.Core.RT.Log;using System.Windows;using Aitex.Core.Utilities;using System.Threading;namespace Aitex.Core.WCF{    public class ServiceClientWrapper<T>    {        ChannelFactory<T> _factory;        T _proxy;        bool _isInError = false;        string _serviceName;        Retry _retryConnect = new Retry();        public ServiceClientWrapper(string endpointConfigurationName, string name)        {            _serviceName = name;            try            {                _factory = new ChannelFactory<T>(endpointConfigurationName);            }            catch (Exception ex)            {                MessageBox.Show("不能创建Service " + name + ",检查配置:" + endpointConfigurationName);                LOG.WriteExeption("不能创建Service "+name+",检查配置:"+endpointConfigurationName, ex);            }        }        public ServiceClientWrapper(string endpointConfigurationName, string name, EndpointAddress address)        {            _serviceName = name;            try            {                _factory = new ChannelFactory<T>(endpointConfigurationName, address);            }            catch (Exception ex)            {                MessageBox.Show("不能创建Service " + name + ",检查配置:" + endpointConfigurationName);                LOG.WriteExeption("不能创建Service " + name + ",检查配置:" + endpointConfigurationName, ex);            }        }        public void Invoke(Action<T> action)        {            if (_factory == null)                return;            if (_proxy == null)            {                _proxy = _factory.CreateChannel();            }                        for (int i = 0; i < 2; i++)            {                if (Do(action))                    break;                Thread.Sleep(10);            }        }        bool Do(Action<T> action)        {            if (_proxy != null && ((IClientChannel)_proxy).State == CommunicationState.Faulted)            {                ((IClientChannel)_proxy).Abort();                _proxy = _factory.CreateChannel();            }            try            {                action(_proxy);                if (_isInError)                {                    _isInError = false;                    //LOG.Info(_serviceName + " 服务恢复");                }                return true;            }            catch (EndpointNotFoundException ex)            {                if (!_isInError)                {                    _isInError = true;                    LOG.WriteExeption(_serviceName + " 连接已经断开。", ex);                }            }            catch (ProtocolException ex)            {                if (!_isInError)                {                    _isInError = true;                    LOG.WriteExeption(_serviceName + " 服务程序异常。", ex);                }            }            catch (Exception ex)            {                if (!_isInError)                {                    _isInError = true;                    LOG.WriteExeption(_serviceName + " 服务异常", ex);                }            }            ((IClientChannel)_proxy).Abort();            _proxy = _factory.CreateChannel();            return false;        }    }}
 |