2013-04-04 8 views
6

Attualmente ho un'applicazione ospitata da IIS che vorrei passare per utilizzare il metodo self-hosted.ServiceStack: accesso a HttpRequest in un'applicazione selfhosted

Ma ho difficoltà ad accedere alla sessione in modo da poter recuperare il nome utente degli utenti correnti.

Questo è il codice che ho usato quando ospitano in IIS che ha funzionato perfettamente:

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

questo si aggiunge per l'host app con il seguente codice ::

container.RegisterAutoWiredAs<ServiceStackAuthTokenService, IAuthTokenService>() 

Durante l'esecuzione di self-hosted HttpContext.Current è null, come posso accedere alla richiesta in un'applicazione self-hosted?

Grazie!

Aggiornamento Ulteriori cose che ho provato:

secondo un post qui: https://groups.google.com/forum/#!msg/servicestack/jnX8UwRWN8A/_XWzTGbnuHgJ

E 'stato suggerito di utilizzare:

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

Questo restituisce appena una nuova sessione IAuth.

Ciò che l'utente in quel post sta facendo è esattamente ciò che sto cercando di ottenere.

Nello scorso post Mythz dice:

Giusto per essere chiari, in modo da formare la chiave di sessione che fa riferimento alla sessione di utenti è necessario sia i cookie ss-id o SS-PID (come determinato da SS- opta). È possibile rimuovere i cookie dall'oggetto IHttpRequest o in altro modo in ASP.NET il singleton HttpContext.Current.Request, quindi qualunque sia il factory IAuthUserSession inietti a prendere qualcosa che può dargli i cookie, ovvero un IRequestContext, IHttpRequest, IService, ecc.

Ma non riesco ancora a vedere un modo per accedere a IHttpRequest.

+0

Quando/Dove finisce GetCurrentAuthToken() viene chiamato nella tua applicazione? Se si trova in un servizio, è possibile passare IHttpRequest e IHttpResponse nel metodo come GetCurrentAuthToken (base.Request, base.Response). – paaschpa

+0

Ciao Paaschpa, si verifica nel livello DAL che non ha alcuna relazione diretta con il livello di servizio. Potrei passare il contesto nei DAL ma ciò violerebbe il design e manterrebbe ogni livello separato. – Rtype

+0

Dopo aver esaminato ulteriormente, posso vedere IHttpRequest e IHttpResponse viene iniettato in servizio tramite l'interfaccia IRequiresRequestContext che si trova nella classe di base del servizio. Fondamentalmente voglio essere in grado di accedere alla stessa cosa in modo da poter accedere alla cache in cui è memorizzata la sessione client. – Rtype

risposta

10

Per ServiceStack 3, è possibile condividere i dati di richiesta tramite il dizionario HostContext.Instance.Items. Per ServiceStack 4, è necessario utilizzare il dizionario HostContext.RequestContext.Items.

Ad esempio, aggiungere un filtro di richiesta nella configurazione applicazione host per salvare il valore:

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

Poi nella classe token di autenticazione tirarla di nuovo fuori:

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 è veramente per richiesta? – Junto

+1

Da quello che posso dire sembra essere. Ad ogni richiesta sembra essere vuoto e nessuna informazione proveniente dalle chiamate precedenti viene mantenuta. Nella fonte dei fermacavi ci si trova in (AppHostBase.cs), che mi suggerisce di essere svuotato su ogni richiesta. pubblico OnEndRequest virtual void() { foreach (var item in HostContext.Instance.Items.Values) { di uscita (voce); } HostContext.Instance.EndRequest(); } Ma come tutte le cose, magari provarlo e vedere se funziona per te. – Rtype

+0

quindi come risparmi le cose nella sessione? – fractal

Problemi correlati