轉載:http://www.csframework.com/archive/1/arc-1-20150109-2193.htm
服務端增加WCF服務全局異常處理機制,任一WCF服務或接口方式出現異常,將統一調用WCF_ExceptionHandler.ProvideFault方法,因此不需要每個方法使用try catch寫法。
C# Code: /// <summary> /// WCF服務端異常處理器 /// </summary> public class WCF_ExceptionHandler : IErrorHandler { #region IErrorHandler Members /// <summary> /// HandleError /// </summary> /// <param name="ex">ex</param> /// <returns>true</returns> public bool HandleError(Exception ex) { return true; } /// <summary> /// ProvideFault /// </summary> /// <param name="ex">ex</param> /// <param name="version">version</param> /// <param name="msg">msg</param> public void ProvideFault(Exception ex, MessageVersion version, ref Message msg) { // //在這裏處理服務端的消息,將消息寫入服務端的日誌 // string err = string.Format("調用WCF接口 '{0}' 出錯", ex.TargetSite.Name) ",詳情:\r\n" ex.Message; var newEx = new FaultException(err); MessageFault msgFault = newEx.CreateMessageFault(); msg = Message.CreateMessage(version, msgFault, newEx.Action); } #endregion }
C# Code: /// <summary> /// WCF服務類的特性 /// </summary> 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<ServiceEndpoint> endpoints, BindingParameterCollection parameters) { } public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase) { var handler = (IErrorHandler)Activator.CreateInstance(_errorHandlerType); foreach (ChannelDispatcherBase dispatcherBase in serviceHostBase.ChannelDispatchers) { var channelDispatcher = dispatcherBase as ChannelDispatcher; if (channelDispatcher != null) channelDispatcher.ErrorHandlers.Add(handler); } } #endregion }
使用: C# Code:
[ServiceBehavior(IncludeExceptionDetailInFaults = true)] [WCF_ExceptionBehaviour(typeof(WCF_ExceptionHandler))] public class AccountModuleService : IAccountModuleService