为了写入日志文件,我在每个类上使用PostSharp和TraceAttribute
。一个新的要求是能够预先记录每个日志条目的SessionID
。使用PostSharp和TraceAttribute用HttpContext的SessionID进行日志记录
虽然PostSharp似乎无法以此方式工作。我已经尝试了两种对我有意义而且都没有用的方法。
尝试#1
我添加了一个字符串参数到TraceAttribute
构造中要传递和由OnEntry
,OnExit
和OnException
方法中。
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
?可以实现此目标的一些解决方法?
你的第二次尝试应该工作...,你确定你可以从你正在跟踪的方法(而不是方面)访问HttpContext.Current?也许你的方法在一个新的线程中运行,这将解释为什么HttpContext.Current不可用。 – Fabio