我TraceAttribute
在每个类上都使用 PostSharp 来写入日志文件。一个新的要求是能够在每个日志条目前加上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] 属性装饰,我修改为这种方法......
[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));
}
有没有办法将会话信息TraceAttribute
以这种方式与 PostSharp 编织在一起?一些可以实现此目标的解决方法?