Wie codiert man am besten den selbstgehosteten ServiceStack, wenn aufgrund einer Null-Anfrage keine Sitzung stattfinden kann?

StackOverflow https://stackoverflow.com//questions/25049848

  •  21-12-2019
  •  | 
  •  

Frage

Ich verwende ServiceStack 3.9.71.Ich wähle den selbstgehosteten Weg, um die Bereitstellung unter Linux zu ermöglichen und trotzdem das Problem zu vermeiden Speicherverlustprobleme plagen Mono.

Die Sache mit selbst gehosteten Diensten ist, dass wir die Anfrage nicht mehr haben.Ohne sie haben wir auch keine Sitzung.Versuche, die Sitzung abzurufen, schlagen fehl

Es werden nur ASP.NET-Anfragen unterstützt, auf die über Singletons zugegriffen werden kann

aufgrund eines Null-Anforderungsobjekts.

Fragen sind:

  1. Kann jemand erklären, warum wir die Anfrage nicht im selbstgehosteten ServiceStack-Dienst haben können?
  2. Wie umgehen wir das?

Wenn der Dienst beispielsweise die Details des Benutzers kennen muss (z. B. was wir in ICustomAuthSession haben würden), der die Anfrage aufgerufen hat, wie machen wir das?Ich kann sehen, dass der Cache tatsächlich die Sitzung enthält, aber da wir die Anfrage nicht haben, gibt es keinen SessionKey, mit dem wir die Sitzung aus dem Cache abrufen können.Ich sehe einige einigermaßen Diskussion darauf, kann aber nicht genau erkennen, was ich tun soll.

War es hilfreich?

Lösung

Selbstgehostete ServiceStack-Anwendungen haben auf die gleiche Weise Zugriff auf die Anforderungen und Sitzungen wie ServiceStack-IIS-Anwendungen.

Zugriff auf die Anfrage

Selbstgehostete Anwendungen verwenden die HttpListenerRequest Klasse, um die HTTP-Anfragen zu verarbeiten, aber ServiceStack abstrahiert dies in eine IHttpRequest, die eine konsistente Möglichkeit bietet, auf die HTTP-Anforderungsdaten zuzugreifen, entweder zwischen IIS oder selbst gehosteten Anwendungen.

Wenn Sie sich in einem ServiceStack-Dienst befinden, können Sie darauf zugreifen IHttpRequest durch das base.Request Objekt. Sehen ServiceBase.cs für die von der Basis bereitgestellten Methoden Service.

public class MyService : Service
{
    // Your action method
    public object Get(MyRequest request)
    {
        // Access to the request
        var request = base.Request;
    }
}

Oder das Anforderungsobjekt wird Ihnen währenddessen zur Verfügung gestellt die Anfragefilter:

this.RequestFilters.Add((httpReq, httpResp, requestDto) => {

    // Access to the request through httpReq 

});

Es kommt selten vor, dass Sie Zugriff auf die ursprüngliche zugrunde liegende Anfrage benötigen, da die Abstraktion von bereitgestellt wird IHttpRequest sollte Sie in den meisten Fällen abdecken.Wenn Sie jedoch beispielsweise auf das Client-Zertifikat der Anforderung zugreifen möchten, können Sie dieses aus der zugrunde liegenden Anforderung abrufen.Sie können dies tun, indem Sie das werfen IHttpRequest.OriginalRequest:

var originalRequest = IHttpRequest.OriginalRequest as HttpListenerRequest;
if(originalRequest != null)
{
    // Example of accessing the client certificate
    var certificate = originalRequest.GetClientCertificate();
}   

Zugriff auf die Sitzung

Es hört sich so an, als ob Sie nicht richtig auf die Sitzung zugreifen.Wenn Sie ServiceStacks verwenden SessionFeature, das von der verwendet wird AuthenticationFeature Dann müssen Sie sich nicht darum kümmern, die SessionId abzurufen und dann Werte vom Cache-Client nachzuschlagen. ServiceStack verfügt über integrierte Methoden für die Handhabung des Zugriffs auf die Sitzung.

Es gibt verschiedene Möglichkeiten, auf die Sitzung zuzugreifen, je nachdem, ob Sie die Authentifizierung von ServiceStack verwenden, die einen eigenen Benutzersitzungsmechanismus bereitstellt, oder ob Sie den einfachen Schlüsselwertspeicher analog zum standardmäßigen ASP.NET-Schlüsselwertsitzungsspeicher verwenden.Du kannst Erfahren Sie hier mehr über Sitzungen.

Der einfache Cache wird gesichert Schlüsselwertspeicher (Untypisierte Sitzungstasche):

public class MyService : Service
{
    public object Get(MyRequest request)
    {
        // Set
        Session.Set<int>("Age",123);

        // Retrieve
        var age = Session.Get<int>("Age");        
    }
}

Verwendung der Sitzung, die von der Authentifizierungsfunktion von ServiceStack bereitgestellt wird, d. h. IAuthSession:

public class MyService : Service
{
    public object Get(MyRequest request)
    {
        // Provides access to the IAuthSession user session (if you are using the authentication feature)
        var session = base.GetSession();
        session.FirstName = "John";
    }
}

Verwenden eines benutzerdefinierten Sitzungstyps mit der Authentifizierungsfunktion von ServiceStack (was Sie anscheinend versuchen).

public class MyService : Service
{
    public object Get(MyRequest request)
    {
        var mySession = SessionAs<MySession>();
        mySession.FirstName = "Clark";
        mySession.LastName = "Kent";
        mySession.SuperheroIdentity = "Superman";
    }
}

public class MySession : AuthUserSession
{
    public string SuperheroIdentity { get; set; }
}

Ich hoffe das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top