2013-04-04 13 views
6

現在、私は自己ホスティングメソッドを使用するために切り替えたいIISホストアプリケーションがあります。ServiceStack:自己ホストアプリケーションのHttpRequestへのアクセス

しかし、現在のユーザーのユーザー名を取得できるように、セッションにアクセスできません。

これは完全に働いたIISでホストする場合、私が使用したコードです:

/// <summary> 
/// A basic wrapper for the service stack session, to allow access to it lower down in the DAL layer without tying us to servicestack. 
/// </summary> 
public class ServiceStackAuthTokenService : IAuthTokenService 
{ 
    /// <summary> 
    /// GetCurrentAuthToken. 
    /// </summary> 
    /// <returns>A string representing the users auth name.</returns> 
    public string GetCurrentAuthToken() 
    { 
     // Grab the current request. 
     var req = HttpContext.Current.Request.ToRequest(); 
     var res = HttpContext.Current.Response.ToResponse(); 

     // Fetch the authentication service. 
     var authService = EndpointHost.AppHost.TryResolve<AuthService>(); 
     authService.RequestContext = new HttpRequestContext(req, res, null); 

     // Grab the session. 
     var session = authService.GetSession(false); 

     // Return the username. 
     return session.UserName; 
    } 

    public string UserPropertyName 
    { 
     get { return "UserName"; } 
    } 
} 

を。これは、次のコードでアプリをホストに追加されます::

container.RegisterAutoWiredAs<ServiceStackAuthTokenService, IAuthTokenService>() 

自己ホストを実行していますHttpContext.Currentがnullの場合、自己ホストアプリケーションのもとでリクエストにどのようにアクセスすればよいですか?

ありがとうございます!私が試してみました

更新 追加物事:それは使用することが示唆されたhttps://groups.google.com/forum/#!msg/servicestack/jnX8UwRWN8A/_XWzTGbnuHgJ

container.Register>(C => AuthService.CurrentSessionFactoryここにポストにつきとして

);

これは、新しいIAuthSessionを返します。

その投稿のユーザーが行っていることは、私が達成しようとしているものです。最後のポストで

Mythzは言う:

だけ明確にするために、SS-によって決定されます(SS-IDまたはSS-pidのクッキーのいずれかを必要とするユーザーセッションを参照するセッションキーを形成するために、オプト)。 IHttpRequestオブジェクトからCookieを取得することも、ASP.NETでHttpContext.Current.Requestシングルトンを取得することもできます。つまり、IRequestContext、IHttpRequest、IServiceなどのCookieを与えることができる何らかのIAuthUserSessionファクトリを取得する必要があります。

しかし、私はまだIHttpRequestにアクセスする方法を見ることができません。

+0

GetCurrentAuthTokenを行います/あなたのアプリケーションで呼び出されますか?それがサービスにある場合、IHttpRequestとIHttpResponseをGetCurrentAuthToken(base.Request、base.Response)のようなメソッドに渡すことができます。 – paaschpa

+0

こんにちはPaaschpa、それはサービス層に直接の関係がないDAL層で発生します。コンテキストをDALに渡すことはできますが、それはデザインに違反し、各レイヤーを別々に保ちます。 – Rtype

+0

これをさらに調べると、IHttpRequestが表示され、IHttpResponseがサービス基本クラスにあるIRequiresRequestContextインターフェイスを介してサービスに注入されていることがわかります。 私は基本的に同じことにアクセスできるようにしたいので、クライアントセッションが保存されているキャッシュにアクセスすることができます。サービスクラスを見て反射鏡を使用して – Rtype

答えて

10

ServiceStack 3の場合、HostContext.Instance.Itemsディクショナリを使用してリクエストデータを共有できます。 ServiceStack 4の場合は、HostContext.RequestContext.Itemsディクショナリを使用してください。

// Put the session into the hostcontext. 
RequestFilters.Add((req, res, requestDto) => 
{ 
    HostContext.Instance.Items.Add("Session", req.GetSession()); 
}); 

次に、あなたの認証トークンのクラスに戻ってそれを引っ張っ::

たとえば、値を保存するためにアプリのホスト構成で要求フィルターを追加し

public string GetCurrentAuthToken() 
{ 
    var session = HostContext.Instance.Items["Session"] as AuthUserSession; 

    if (session != null) 
    { 
    return session.UserName; 
    } 

    throw new Exception("No attached session found."); 
} 
+0

HostContext.Instanceは本当にリクエストごとですか? – Junto

+1

私はそれがそうであると言うことができるからです。要求ごとに、空であると思われ、以前の呼び出しからの情報は保持されません。 servictstackソースには、(AppHostBase.cs)の中にこれがあります。これは、私の要求ごとに空になっていることを示唆しています。 パブリック仮想ボイドOnEndRequest() {foreachの(HostContext.Instance.Items.ValuesにおけるVAR項目) {リリース(アイテム) } HostContext.Instance.EndRequest(); } しかし、すべてのもののように、おそらくそれを試して、あなたのために動作するかを確認します。 – Rtype

+0

セッションに戻すにはどうしたらいいですか? – fractal

関連する問題