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.
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
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
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