#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
}
}