WCF自定义Attribute记录日志或异常
来源:互联网 发布:linux字体 编辑:程序博客网 时间:2024/06/14 03:29
1、定义一个attribute,同时继承接口 IOperationBehavior
[AttributeUsage(AttributeTargets.Method)] public class RecordAttribute : Attribute, IOperationBehavior { private readonly string _operationName; private readonly RecordType _recordType; public RecordAttribute(string methodname, RecordType recordType) { _operationName = methodname; _recordType = recordType; } protected RecordInvoker CreateInvoker(IOperationInvoker oldInvoker) { return new RecordInvoker(oldInvoker, _operationName, _recordType); } public void Validate(OperationDescription operationDescription) { } public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) { IOperationInvoker oldInvoker = dispatchOperation.Invoker; dispatchOperation.Invoker = CreateInvoker(oldInvoker); } public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation) { } public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters) { } }
2. 定义RecordInvoker ,继承IOperationInvoker
public class RecordInvoker : IOperationInvoker { private readonly IOperationInvoker _mOldInvoker; private readonly string _operationName; private readonly RecordType _recordType; protected void PreInvoke(object instance, object[] inputs) { if (_recordType == RecordType.Log || _recordType == RecordType.LogAndException) { //记录日志 } } protected void PostInvoke(object instance, object returnedValue, object[] outputs, Exception err) { if (err != null && (_recordType == RecordType.Exception || _recordType == RecordType.LogAndException)) //如果有异常 { //记录异常 } } public RecordInvoker(IOperationInvoker oldInvoker, string operationName, RecordType recordType) { _mOldInvoker = oldInvoker; _operationName = operationName; _recordType = recordType; } public object[] AllocateInputs() { return _mOldInvoker.AllocateInputs(); } public object Invoke(object instance, object[] inputs, out object[] outputs) { PreInvoke(instance, inputs); object returnedValue = null; var outputParams = new object[] { }; Exception exception = null; try { returnedValue = _mOldInvoker.Invoke(instance, inputs, out outputParams); outputs = outputParams; return returnedValue; } catch (Exception err) { outputs = null; exception = err; return null; } finally { PostInvoke(instance, returnedValue, outputParams, exception); } } public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state) { PreInvoke(instance, inputs); return _mOldInvoker.InvokeBegin(instance, inputs, callback, state); } public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result) { object returnedValue = null; object[] outputParams = { }; Exception exception = null; try { returnedValue = _mOldInvoker.InvokeEnd(instance, out outputs, result); outputs = outputParams; return returnedValue; } catch (Exception err) { outputs = null; exception = err; return null; } finally { PostInvoke(instance, returnedValue, outputParams, exception); } } public bool IsSynchronous { get { return _mOldInvoker.IsSynchronous; } } }
3、enum RecordType 定义如下
public enum RecordType { None = 1, /// <summary> /// 记录日志 /// </summary> Log = 2, /// <summary> /// 记录异常 /// </summary> Exception = 3, /// <summary> /// 记录日志和异常 /// </summary> LogAndException = 4 }
4、在需要记录日志的方法上加上自定义的特性:
[Record("Seo.CompanyService.GetCompanyWithCity", RecordType.Exception)]
public IList<Company> GetCompanyWithCity(long cityId)
- WCF自定义Attribute记录日志或异常
- WCF 自定义异常
- 使用WCF Ria Service和Log4net在服务器端记录异常日志/ExceptionLog
- WCF的自定义异常处理
- 异常和日志记录
- 保存异常日志记录
- 异常日志记录
- 异常日志记录 DDLog
- 利用Attribute和IErrorHandler处理WCF全局异常
- 自定义未捕获异常时输出的日志为空或日志文件没有生成
- 自定义日志记录文件
- 保存异常日志记录类
- 日志记录异常堆栈详细信息
- WCF全局异常 可记录服务器端全部异常信息
- java 自定义异常,记录日志简单说明!留着以后真接复制
- java记录日志(异常记录)
- 给ADF BC EO Row或Attribute添加Custom异常
- 自定义Log4j日志记录例子
- 谈谈怎么实现Oracle数据库分区表
- C#之事件
- windows 7 如何关闭 程序崩溃时弹出的"windows正在检查该问题的解决方案"
- 关于***-Prefix.pch has been modified since the precompiled header was built的错误
- memcached-hashtable
- WCF自定义Attribute记录日志或异常
- javascript调用dll方法
- 移植你的driver到64位平台
- 当产品设计遇上互联网
- javascript表单验证代码大全
- hadoop常用命令
- C# 字符串格式化
- 将jar文件与dex文件的转换 .
- c# 泛型整理