#region using System; using System.Collections.ObjectModel; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; #endregion namespace CSFrameworkV5.WCFContract { /// /// WCF服务端异常处理器 /// public class WCF_ExceptionHandler : IErrorHandler { #region IErrorHandler Members /// /// HandleError /// /// ex /// true public bool HandleError(Exception ex) { return true; } /// /// ProvideFault /// /// ex /// version /// msg public void ProvideFault(Exception ex, MessageVersion version, ref Message msg) { // //在这里处理服务端的消息,将消息写入服务端的日志 // //string methodName = ex.TargetSite.Name;//WCF方法名称 var err = "调用WCF接口出错,详情:\r\n" + ex.Message; var newEx = new FaultException(err); var msgFault = newEx.CreateMessageFault(); msg = Message.CreateMessage(version, msgFault, newEx.Action); } #endregion } /// /// WCF服务类的特性 /// public class WCF_ExceptionBehaviourAttribute : Attribute, IServiceBehavior { private readonly Type _errorHandlerType; public WCF_ExceptionBehaviourAttribute(Type errorHandlerType) { _errorHandlerType = errorHandlerType; } #region IServiceBehavior Members public void Validate(ServiceDescription description, ServiceHostBase serviceHostBase) { } public void AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, Collection endpoints, BindingParameterCollection parameters) { } public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase) { var handler = (IErrorHandler)Activator.CreateInstance(_errorHandlerType); foreach (var dispatcherBase in serviceHostBase.ChannelDispatchers) { var channelDispatcher = dispatcherBase as ChannelDispatcher; if (channelDispatcher != null) channelDispatcher.ErrorHandlers.Add(handler); } } #endregion } }