WCF服務全局統一異常處理機制

轉載: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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章