2

TraceAttributeログファイルに書き込むために、各クラスでPostSharpを使用しています。新しい要件は、各ログエントリの前に。を追加できるようにすることSessionIDです。

ただし、PostSharpはこのように機能しないようです。私は自分にとって意味のある2つのアプローチを試しましたが、どちらも機能しませんでした。

#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で提出されている私のセッションを逃していました。

この行をconfigに追加すると、正常に動作するようになりました。

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