爲了寫入日誌文件,我在每個類上使用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