2012-09-28 58 views
2

为了写入日志文件,我在每个类上使用PostSharp和TraceAttribute。一个新的要求是能够预先记录每个日志条目的SessionID使用PostSharp和TraceAttribute用HttpContext的SessionID进行日志记录

虽然PostSharp似乎无法以此方式工作。我已经尝试了两种对我有意义而且都没有用的方法。

尝试#1

我添加了一个字符串参数到TraceAttribute构造中要传递和由OnEntryOnExitOnException方法中。

private readonly string _sessionID; 

public TraceAttribute(string sessionID) 
{ 
    _sessionID = sessionID; 
    logger = new Logger(); 
} 

public override void OnExit(MethodExecutionArgs args) 
{ 
    logger.LogMethodExit(string.Format("Session {0} Exiting {1}.{2}", _sessionID, args.Method.DeclaringType.FullName, args.Method.Name)); 
} 

我的控制器都是用[追踪]属性原来的装饰,我修改,以这种方法...

[Trace(HttpContext.Session.SessionID)] 

这不起作用,因为HttpContext不可用在静态环境。

因此,这个想法是窗外。

尝试#2

所以我的下一个尝试是简单地在本地创建sessionId变量在TraceAttribute每个方法...

public override void OnEntry(MethodExecutionArgs args) 
{ 
    var sessionID = HttpContext.Current.Session.SessionID; 
    logger.LogMethodEntry(string.Format("Session {0} Entering {1}.{2}", sessionID, args.Method.DeclaringType.FullName, args.Method.Name)); 
} 

这不起作用,无论是作为再次, HttpContext尚不可用,并且在运行时尽快运行解决方案时为null对象。

#尝试3

public override void OnEntry(MethodExecutionArgs args) 
{ 
    string sessionID = "Not initialized"; 
    if (HttpContext.Current.Session.SessionID != null) 
     sessionID = HttpContext.Current.Session.SessionID; 
    logger.LogMethodEntry(string.Format("Session {0} Entering {1}.{2}", sessionID, args.Method.DeclaringType.FullName, args.Method.Name)); 
} 

有没有什么办法让会话信息转换为以这种方式编织与PostSharp一个TraceAttribute?可以实现此目标的一些解决方法?

+0

你的第二次尝试应该工作...,你确定你可以从你正在跟踪的方法(而不是方面)访问HttpContext.Current?也许你的方法在一个新的线程中运行,这将解释为什么HttpContext.Current不可用。 – Fabio

回答

0

明白了它的工作原理,我错过了我在web.config中的会话。

将此行添加到配置中,现在工作正常。

<sessionState mode="InProc" cookieless="false" timeout="20"/> 
相关问题