2016-10-08 59 views
0

我想使用Log PostSharp方面來輕鬆記錄我的異步Web API端點的所有入口和出口值。使用PostSharp記錄參數並返回集合

例如:

[Log] 
[HttpGet] 
public async Task<List<string>> Get(List<int> ids) 
{ 
    var result = await GetResult(ids); 
    return result; 
} 

結果是:

DEBUG Controllers.MyController - Entering: MyController.Get(this = {Controllers.MyController}) : 
             {System.Collections.Generic.List`1[System.String]} 

DEBUG Controllers.MyController - Leaving: MyController.Get(this = {Controllers.MyController}) : 
     {System.Threading.Tasks.Task`1[System.Collections.Generic.List`1[System.String]]} 

代替實際值。我怎麼能做到這一點?

回答

3

Log方面不支持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的行爲方式與標準Log方面一樣。

本示例不適用於泛型方法和類型,不適用於更復雜的參數和返回類型,並具有許多其他限制。 您可以在此PostSharp示例中找到更完整的解決方案:CustomLogging。不幸的是,這個例子不包含任何關於ApplyToStateMachine = true的信息。

編輯11/04/2016: 這個例子工作在PostSharp 5.0.10,即使是異步方法。 args.ReturnValue包含異步方法的返回值。

+0

'args.ReturnValue'爲null。任何想法爲什麼? – Nicholas

+0

這看起來像OnMethodBoundaryAspect的bug或奇怪的限制。我添加了一個示例如何解決它,但它是遠非理想。 –

+0

仍然不工作:( – Nicholas