C# 使用PostSharp记录参数和返回集合

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 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及更早版本中的异步方法。您可以轻松开发自己的自定义日志功能:

[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。