2

TraceAttribute在每个类上都使用 PostSharp 来写入日志文件。一个新的要求是能够在每个日志条目前加上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] 属性装饰,我修改为这种方法......

[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 编织在一起?一些可以实现此目标的解决方法?

4

1 回答 1

0

搞定了,我错过了在 web.config 中上交的会话。

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

<sessionState mode="InProc" cookieless="false" timeout="20"/>
于 2012-09-30T22:34:37.077 回答