2017-04-13 51 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 

    } 
} 

我的問題是爲什麼?這是同樣的要求。我究竟做錯了什麼?

對於背景 - 我用智威湯遜(如4.5.6)和「MyOtherClass」實際上是當故障是不夠顯著失敗交易或觸發電子郵件通知它決定一個單獨的錯誤處理類。

回答

1

當您使用HostContext.TryGetCurrentRequest()你不訪問相同IRequest實例,它創建ASP.NET請求這就需要從緩存中重新獲取會話的新實例。

您將需要通過服務中的相同base.Request實例(推薦),這將允許您訪問相同的本地緩存會話實例,或者您可以在使用IRequest.SaveSession()進行更改後保存會話會話被重新獲取,它將加載修改後的會話。如果您使用默認的MemoryCacheClient,則不會產生I/O成本。