C# 使用PostSharp记录参数和返回集合
我想使用Log PostSharp特性,以便轻松记录异步Web API端点的所有入口和出口值 例如:C# 使用PostSharp记录参数和返回集合,c#,.net,asp.net-web-api,log4net,postsharp,C#,.net,Asp.net Web Api,Log4net,Postsharp,我想使用Log PostSharp特性,以便轻松记录异步Web API端点的所有入口和出口值 例如: [Log] [HttpGet] public async Task<List<string>> Get(List<int> ids) { var result = await GetResult(ids); return result; } 而不是实际值。如何实现这一点?aspect不支持PostSharp 4.3及更早版本中的异步方法。您可
[Log]
[HttpGet]
public async Task<List<string>> Get(List<int> ids)
{
var result = await GetResult(ids);
return result;
}
而不是实际值。如何实现这一点?aspect不支持PostSharp 4.3及更早版本中的异步方法。您可以轻松开发自己的自定义日志功能:
[PSerializable]
public sealed class CustomLog : OnMethodBoundaryAspect
{
public CustomLog()
{
ApplyToStateMachine = true;
}
public override void OnSuccess(MethodExecutionArgs args)
{
var stringBuilder = new StringBuilder();
var declaringType = args.Method.DeclaringType;
stringBuilder.Append("Exiting ");
stringBuilder.Append(declaringType.FullName);
stringBuilder.Append('.');
stringBuilder.Append(args.Method.Name);
if (!args.Method.IsConstructor && ((MethodInfo) args.Method).ReturnType != typeof(void))
{
stringBuilder.Append(" with return value ");
stringBuilder.Append(args.ReturnValue);
}
Logger.WriteLine(stringBuilder.ToString());
}
}
重要的是在构造函数中:ApplyToStateMachine=true
指示PostSharp将方面正确应用于状态机(异步方法和枚举器)。如果没有ApplyToStateMachine=true
,CustomLog的行为方式将与标准方面相同
此示例不适用于泛型方法和类型,不适用于更复杂的参数和返回类型,并且有许多其他限制。
您可以在此PostSharp示例中找到更完整的解决方案:。不幸的是,该示例不包含关于ApplyToStateMachine=true
的任何信息
2016年4月11日编辑:
此示例在PostSharp 5.0.10中工作,即使对于异步方法也是如此
args.ReturnValue
包含异步方法的返回值。aspect不支持PostSharp 4.3及更早版本中的异步方法。您可以轻松开发自己的自定义日志功能:
[PSerializable]
public sealed class CustomLog : OnMethodBoundaryAspect
{
public CustomLog()
{
ApplyToStateMachine = true;
}
public override void OnSuccess(MethodExecutionArgs args)
{
var stringBuilder = new StringBuilder();
var declaringType = args.Method.DeclaringType;
stringBuilder.Append("Exiting ");
stringBuilder.Append(declaringType.FullName);
stringBuilder.Append('.');
stringBuilder.Append(args.Method.Name);
if (!args.Method.IsConstructor && ((MethodInfo) args.Method).ReturnType != typeof(void))
{
stringBuilder.Append(" with return value ");
stringBuilder.Append(args.ReturnValue);
}
Logger.WriteLine(stringBuilder.ToString());
}
}
重要的是在构造函数中:ApplyToStateMachine=true
指示PostSharp将方面正确应用于状态机(异步方法和枚举器)。如果没有ApplyToStateMachine=true
,CustomLog的行为方式将与标准方面相同
此示例不适用于泛型方法和类型,不适用于更复杂的参数和返回类型,并且有许多其他限制。
您可以在此PostSharp示例中找到更完整的解决方案:。不幸的是,该示例不包含关于ApplyToStateMachine=true
的任何信息
2016年4月11日编辑:
此示例在PostSharp 5.0.10中工作,即使对于异步方法也是如此
args.ReturnValue
包含异步方法的返回值。args.ReturnValue
为空。知道为什么吗?这似乎是OnMethodBoundaryAspect的一个bug或奇怪的限制。我添加了一个如何解决这个问题的示例,但它还远远不够理想。最好知道什么不起作用:)。但是这个限制似乎是固定的,第一个示例似乎在PostSharp 5.0.10中工作。抱歉:)我的意思是args。ReturnValue
总是空的。看起来我可能需要等待PS 5。args.ReturnValue
为空。知道为什么吗?这似乎是OnMethodBoundaryAspect的一个bug或奇怪的限制。我添加了一个如何解决这个问题的示例,但它还远远不够理想。最好知道什么不起作用:)。但是这个限制似乎是固定的,第一个示例似乎在PostSharp 5.0.10中工作。抱歉:)我的意思是args。ReturnValue
总是空的。看起来我可能需要等待PS 5。