2013-04-04 9 views
6

Ich habe derzeit eine IIS-gehostete Anwendung, die ich wechseln möchte, um die selbst gehostete Methode zu verwenden.ServiceStack: Zugriff auf die HttpRequest in einer Selfhosted-Anwendung

Ich habe jedoch Schwierigkeiten beim Zugriff auf die Sitzung, so dass ich den Benutzernamen des aktuellen Benutzers abrufen kann.

Dies ist der Code, den ich verwendet, wenn unter IIS-Hosting, die perfekt funktioniert:

/// <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"; } 
    } 
} 

Dies ist auf die App-Host mit dem folgenden Code hinzugefügt wird ::

container.RegisterAutoWiredAs<ServiceStackAuthTokenService, IAuthTokenService>() 

Wenn selbst gehostete laufen Die HttpContext.Current ist null. Wie kann ich auf die Anfrage in einer selbst gehosteten Anwendung zugreifen?

Danke!

aktualisieren Zusätzliche Dinge, die ich versucht habe:

nach einem Beitrag hier: https://groups.google.com/forum/#!msg/servicestack/jnX8UwRWN8A/_XWzTGbnuHgJ

Es wurde vorgeschlagen, zu verwenden:

container.Register> (c => AuthService.CurrentSessionFactory);

Dies gibt nur eine neue IAuthSession zurück.

Was der Benutzer in diesem Beitrag tut, ist genau das, was ich versuche zu erreichen.

Im letzten Beitrag Mythz sagt:

Nur klar sein, um den Sitzungsschlüssel zu bilden, die die Benutzer-Session Sie entweder die ss-ID oder ss-pid Cookies müssen verweist (wie von ss- bestimmt entscheidet). Sie können Cookies vom IHttpRequest-Objekt oder anderweitig in ASP.NET vom HttpContext.Current.Request Singleton absetzen. Daher muss jede IAuthUserSession-Factory, die Sie injizieren, etwas mitnehmen, das ihr die Cookies geben kann, dh entweder IRequestContext, IHttpRequest, IService, etc .

Aber ich sehe immer noch einen Weg, um die IHttpRequest zugreifen.

+0

Wann/Wo kommt GetCurrentAuthToken() in Ihrer Bewerbung aufgerufen werden? Wenn es in einem Service ist, könnten Sie IHttpRequest und IHttpResponse in die Methode wie GetCurrentAuthToken (base.Request, base.Response) übergeben. – paaschpa

+0

Hi Paaschpa, Es tritt in der DAL-Schicht auf, die keine direkte Beziehung zurück zur Service-Schicht hat. Ich könnte den Kontext in die DALs übertragen, aber das würde das Design verletzen und jede Ebene getrennt halten. – Rtype

+0

Wenn ich mir das genauer ansehe, kann ich die IHttpRequest sehen und die IHttpResponse wird über die IRequiresRequestContext-Schnittstelle, die sich in der Service-Basisklasse befindet, in den Dienst eingefügt. Ich möchte im Grunde auf das gleiche zugreifen können, damit ich Zugriff auf den Cache erhalten kann, in dem die Clientsitzung gespeichert ist. – Rtype

Antwort

10

Für ServiceStack 3 können Sie Anforderungsdaten über das HostContext.Instance.Items Dictionary teilen. Für ServiceStack 4 sollten Sie das HostContext.RequestContext.Items Dictionary verwenden.

zum Beispiel einer Anfrage Filter in der App-Host-Konfiguration hinzufügen, um den Wert zu speichern:

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

Dann in Ihrer Authentifizierungstoken Klasse zieht es wieder aus:

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

Ist HostContext.Instance wirklich pro Anfrage? – Junto

+1

Von dem, was ich sagen kann, scheint es zu sein. Bei jeder Anforderung scheint es leer zu sein und keine Information von den vorherigen Aufrufen wird beibehalten. In der servictstack Quelle gibt es diese in (AppHostBase.cs), die mir vorschlägt, es wird bei jeder Anfrage geleert. public virtual void OnEndRequest() { foreach (var Artikel in HostContext.Instance.Items.Values) { Mitteilung (item); } HostContext.Instance.EndRequest(); } Aber wie alle Dinge vielleicht versuchen Sie es und sehen, ob es für Sie funktioniert. – Rtype

+0

Wie speichern Sie die Dinge wieder in die Sitzung? – fractal

Verwandte Themen