2012-09-28 94 views
2

爲了寫入日誌文件,我在每個類上使用PostSharp和TraceAttribute。一個新的要求是能夠預先記錄每個日誌條目的SessionID使用PostSharp和TraceAttribute用HttpContext的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(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?可以實現此目標的一些解決方法?

+0

你的第二次嘗試應該工作...,你確定你可以從你正在跟蹤的方法(而不是方面)訪問HttpContext.Current?也許你的方法在一個新的線程中運行,這將解釋爲什麼HttpContext.Current不可用。 – Fabio

回答

0

明白了它的工作原理,我錯過了我在web.config中的會話。

將此行添加到配置中,現在工作正常。

<sessionState mode="InProc" cookieless="false" timeout="20"/> 
相關問題