| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 | using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using System.ServiceModel.Channels;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 bool ActionFailed        {            get            {                return _isInError;            }        }        public ServiceClientWrapper(string endpointConfigurationName, string name)        {            _serviceName = name;            try            {                _factory = new ChannelFactory<T>(endpointConfigurationName);            }            catch (Exception ex)            {                MessageBox.Show("不能创建Service " + name + ",检查配置:" + endpointConfigurationName);                LOG.Error("不能创建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.Error("不能创建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.Error(_serviceName + " 连接已经断开.", ex);                }            }            catch (ProtocolException ex)            {                if (!_isInError)                {                    _isInError = true;                    LOG.Error(_serviceName + " 服务程序异常.", ex);                }            }            catch (Exception ex)            {                if (!_isInError)                {                    _isInError = true;                    LOG.Error(_serviceName + " 服务异常", ex);                }            }            ((IClientChannel)_proxy).Abort();            _proxy = _factory.CreateChannel();            return false;        }        private Binding CreateBinding(string binding)        {            Binding bindinginstance = null;            if (binding.ToLower() == "basichttpbinding")            {                BasicHttpBinding ws = new BasicHttpBinding();                ws.MaxBufferSize = 2147483647;                ws.MaxBufferPoolSize = 2147483647;                ws.MaxReceivedMessageSize = 2147483647;                ws.ReaderQuotas.MaxStringContentLength = 2147483647;                ws.CloseTimeout = new TimeSpan(0, 10, 0);                ws.OpenTimeout = new TimeSpan(0, 10, 0);                ws.ReceiveTimeout = new TimeSpan(0, 10, 0);                ws.SendTimeout = new TimeSpan(0, 10, 0);                bindinginstance = ws;            }            else if (binding.ToLower() == "netnamedpipebinding")            {                NetNamedPipeBinding ws = new NetNamedPipeBinding();                ws.MaxReceivedMessageSize = 65535000;                bindinginstance = ws;            }            else if (binding.ToLower() == "nettcpbinding")            {                NetTcpBinding ws = new NetTcpBinding();                ws.MaxReceivedMessageSize = 65535000;                ws.Security.Mode = SecurityMode.None;                bindinginstance = ws;            }            else if (binding.ToLower() == "wsdualhttpbinding")            {                WSDualHttpBinding ws = new WSDualHttpBinding();                ws.MaxReceivedMessageSize = 65535000;                bindinginstance = ws;            }            else if (binding.ToLower() == "webhttpbinding")            {                //WebHttpBinding ws = new WebHttpBinding();                //ws.MaxReceivedMessageSize = 65535000;                //bindinginstance = ws;            }            else if (binding.ToLower() == "wsfederationhttpbinding")            {                WSFederationHttpBinding ws = new WSFederationHttpBinding();                ws.MaxReceivedMessageSize = 65535000;                bindinginstance = ws;            }            else if (binding.ToLower() == "wshttpbinding")            {                WSHttpBinding ws = new WSHttpBinding(SecurityMode.None);                ws.MaxReceivedMessageSize = 65535000;                ws.Security.Message.ClientCredentialType = System.ServiceModel.MessageCredentialType.Windows;                ws.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Windows;                bindinginstance = ws;            }            return bindinginstance;        }    }}
 |