WCF异处理

来源:互联网 发布:手机怎样开淘宝店铺 编辑:程序博客网 时间:2024/05/16 13:45

1.服务器端:

    [AttributeUsage(AttributeTargets.Class)]
    public class ErrorHandlerBehavior : Attribute, IServiceBehavior, IErrorHandler
    {
        protected Type ServiceType
        {
            get;
            set;
        }
       
        void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            ServiceType = serviceDescription.ServiceType;
            foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
            {
                // 增加错误处理器
                dispatcher.ErrorHandlers.Add(this);
            }
        }

        /// <summary>
        /// 检查服务描述和服务宿主,以确认服务可以成功运行
        /// </summary>
        /// <param name="serviceDescription">服务描述</param>
        /// <param name="serviceHostBase">服务宿主</param>
        void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {

        }

        /// <summary>
        /// 为契约增加自定义绑定参数
        /// </summary>
        /// <param name="serviceDescription">服务描述</param>
        /// <param name="serviceHostBase">服务宿主</param>
        /// <param name="endpoints">服务端点</param>
        /// <param name="bindingParameters">需要增加的自定义绑定参数</param>
        void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
        {

        }
       
        /// <summary>
        /// 在异常返回给客户端之后被调用
        /// </summary>
        /// <param name="error">异常</param>
        /// <returns></returns>
        bool IErrorHandler.HandleError(Exception error)
        {
            //记录日志的异常信息
            var sb = new StringBuilder();
            sb.Append("IErrorHandler - HandleError错误:").AppendLine(error.ToString());
            var wcffault = error as FaultException<WcfFaultInfo>;
            if (!ReferenceEquals(wcffault,null))
            {
                sb.AppendLine(wcffault.Detail.ToString());
            }
            sb.AppendLine(Environment.NewLine);
            LogFunc.AddLog(sb.ToString());
            // true - 已处理
            return true;
        }

        /// <summary>
        /// 在异常发生后,异常信息返回前被调用
        /// </summary>
        /// <param name="error">异常</param>
        /// <param name="version">SOAP版本</param>
        /// <param name="fault">返回给客户端的错误信息</param>
        void IErrorHandler.ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            var fe = new FaultException<WcfFaultInfo>(new WcfFaultInfo(error));
            MessageFault mf = fe.CreateMessageFault();
            fault = Message.CreateMessage(version, mf, fe.Action);
        }

    }

 

2.客户端:

   /// <summary>
    ///
    /// </summary>
    internal static class ErrorHelper
    {
        /// <summary>
        /// 服务器端返回客户端的错误处理
        /// </summary>
        /// <param name="fault"></param>
        /// <returns></returns>
        internal static FaultException<WcfFaultInfo> ExceptionHandle(this FaultException<WcfFaultInfo> fault)
        {
            var sb=new StringBuilder();
            sb.AppendLine("WcfFaultInfo--");
            sb.AppendLine(fault.ToString());
            sb.AppendLine(fault.Detail.Message);
            sb.AppendLine(fault.Detail.InnerMsg);
            LogFunc.AddLog(sb.ToString());
            return fault;
        }
       
        /// <summary>
        /// 服务器端返回客户端的错误处理
        /// </summary>
        /// <param name="fault"></param>
        /// <returns></returns>
        internal static FaultException ExceptionHandle(this FaultException fault)
        {
           var wcfFault= fault as FaultException<WcfFaultInfo>;
            if(wcfFault!=null)
            {
                var sb = new StringBuilder();
                sb.AppendLine("WcfFaultInfo--");
                sb.AppendLine(fault.ToString());
                sb.AppendLine(wcfFault.Detail.Message);
                sb.AppendLine(wcfFault.Detail.InnerMsg);
                LogFunc.AddLog(sb.ToString());
            }
            else
            {
                LogFunc.AddLog(fault.ToString());
            }

            return fault;
        }
    }

---通道

      /// <summary>
        ///
        /// </summary>
        /// <param name="func"></param>
        /// <returns></returns>
        private TResult SyncFunc<TResult>(Func<TResult> func)
        {
            TResult vResult=default(TResult);
            try
            {
                vResult=func();
            }
            catch (TimeoutException ex)
            {
                Abort();
                LogFunc.AddLog(ex, "TimeoutException--");
            }
            catch (FaultException<WcfFaultInfo> ex)
            {
                Abort();
                ex.ExceptionHandle();
            }
            catch (FaultException ex)
            {
                Abort();
                ex.ExceptionHandle();
            }
            catch (CommunicationException ex)
            {
                Abort();
                LogFunc.AddLog(ex, "CommunicationException--");
            }
            return vResult;
        }

 

 

参考:http://msdn.microsoft.com/zh-cn/library/gg281715.aspx