2017-04-13 7 views
1

私のリクエストフィルタで、後でサービスからアクセスするカスタムセッションでいくつかのプロパティを設定しています。これは期待どおりに動作します。サービス外のセッションにアクセスすると複製が作成される

リクエスト・フィルタ:私のサービスで

public sealed class CustomAttribute:RequestFilterAttribute 
{ 

    public override void Execute(IRequest req, IResponse res, object requestDto) 
    { 
     var session = req.SessionAs<CustomSession>(); 

     if (!session.FromToken) 
     { 
      throw new AuthenticationException("Please authenticate using bearer token or with flag 'UseTokenCookie' set to true."); 
     } 

     ... do some work ... 

     session.X = tup.Item2; 
     session.Y = tup.Item1; 
     req.SaveSession(session); 

    } 
} 

var session = this.SessionAs<CustomSession>(); 
var myX = session.X; 
var myY = session.Y; 

... do some work ... 

var someObj = new MyOtherClass(); 
someObj.DoSomeWork(); 

後で同じ要求で、私はこれらの同じプロパティにアクセスしようとした別のセッションを返されました。

public class MyOtherClass 
{ 
    ...stuff... 
    public void DoSomeWork() 
    { 
     ... 
     var req = HostContext.AppHost.TryGetCurrentRequest(); 
     var session = req.SessionAs<CustomSession>(); //-> this returns a new session? 
     var myX = session.X; //-> so this is null 
     var myY = session.Y; //-> and this is null 

    } 
} 

私の質問はなぜですか?それは同じ要求です。私は間違って何をしていますか?

コンテキストの場合 - 私はJWTを使用しています(4.5.6以降)。 'MyOtherClass'は実際にトランザクションが失敗するか電子メール通知をトリガーするのに十分な時間がかかるかを判断するシングルトーンエラー処理クラスです。あなたがHostContext.TryGetCurrentRequest()を使用するときは、同じIRequestインスタンスにアクセスしていない

答えて

1

は、それがキャッシュからセッションを再フェッチする必要があるASP.NETの要求のための新しいインスタンスを作成します。

サービスで同じbase.Requestインスタンスを渡す必要があります(推奨)。ローカルでキャッシュされた同じセッションインスタンスにアクセスできるようにするか、またはIRequest.SaveSession()を使用してセッションを保存することができます。セッションが再フェッチされると、変更されたセッションがロードされます。デフォルトのMemoryCacheClientを使用している場合、I/Oコストは発生しません。

関連する問題