【发布时间】:2012-09-28 14:21:36
【问题描述】:
我在每个类上使用 PostSharp 和 TraceAttribute,以便写入日志文件。一个新要求是能够在每个日志条目前添加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
所以我的下一个尝试是简单地为TraceAttribute 中的每个方法在本地创建sessionId 变量...
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 不可用。
标签: asp.net-mvc-3 c#-4.0 logging aop postsharp