TraceAttribute
ログファイルに書き込むために、各クラスでPostSharpを使用しています。新しい要件は、各ログエントリの前に。を追加できるようにすることSessionID
です。
ただし、PostSharpはこのように機能しないようです。私は自分にとって意味のある2つのアプローチを試しましたが、どちらも機能しませんでした。
#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で織り込まれたセッション情報を取得する方法はありますか?この目標を達成できるいくつかの回避策はありますか?