Quelle est la meilleure façon de coder dans ServiceStack auto-hébergé lorsque nous ne pouvons pas avoir de session en raison d'une requête nulle ?

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

  •  21-12-2019
  •  | 
  •  

Question

J'utilise ServiceStack 3.9.71.Je me lance dans la voie de l'auto-hébergement pour pouvoir déployer sur Linux tout en évitant le Des problèmes de fuite de mémoire affectent Mono.

Le problème avec le service auto-hébergé, c’est que nous n’avons plus la demande.Sans cela, nous n'avons pas non plus de séance.Les tentatives pour obtenir la session échoueront avec

Seules les requêtes ASP.NET accessibles via Singletons sont prises en charge

en raison d'un objet de requête nul.

Les questions sont :

  1. Quelqu'un peut-il expliquer pourquoi nous ne pouvons pas avoir la demande dans le service ServiceStack auto-hébergé ?
  2. Comment pouvons-nous le contourner?

Par exemple, si le service a besoin de connaître les détails de l'utilisateur (par exemple ce que nous aurions dans ICustomAuthSession) qui a invoqué la demande, comment pouvons-nous procéder ?Je peux voir que le cache contient réellement la session, mais comme nous n'avons pas la demande, il n'y a pas de SessionKey que nous pouvons utiliser pour récupérer la session du cache.J'en vois un peu discussion dessus, mais je ne sais pas vraiment quoi faire exactement.

Était-ce utile?

La solution

Les applications ServiceStack auto-hébergées ont accès à la requête et aux sessions de la même manière que les applications ServiceStack IIS.

Accéder à la demande

Les applications auto-hébergées utilisent le HttpListenerRequest classe pour gérer les requêtes HTTP, mais ServiceStack les résume dans un IHttpRequest, qui fournit un moyen cohérent d'accéder aux données de requête HTTP, entre IIS ou des applications auto-hébergées.

Si vous êtes dans un service ServiceStack, vous pouvez accéder au IHttpRequest à travers le base.Request objet. Voir ServiceBase.cs pour les méthodes fournies par la base de Service.

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

Ou l'objet de la requête vous est fourni lors les filtres de requêtes:

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

    // Access to the request through httpReq 

});

Il est rare que vous ayez besoin d'accéder à la requête sous-jacente d'origine, car l'abstraction fournie par IHttpRequest devrait vous couvrir dans la plupart des cas.Mais si vous souhaitez, par exemple, accéder au certificat client de la demande, vous pouvez l'obtenir à partir de la demande sous-jacente.Vous pouvez le faire en lançant le IHttpRequest.OriginalRequest:

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

Accéder à la séance

Il semble que vous n'accédiez pas correctement à la session.Si vous utilisez ServiceStack SessionFeature, qui est utilisé par le AuthenticationFeature alors vous n'avez pas à vous soucier de récupérer le SessionId, puis de rechercher les valeurs du client de cache, ServiceStack a intégré des méthodes pour gérer l'accès à la session.

Il existe différentes manières d'accéder à la session selon que vous utilisez l'authentification de ServiceStack qui fournit son propre mécanisme de session utilisateur, ou si vous utilisez le stockage simple de valeurs de clé analogue au magasin de sessions de valeurs de clé ASP.NET standard.Tu peux en savoir plus sur les séances ici.

Le simple cache sauvegardé Magasin de valeurs clés (Sac de séance non typé) :

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

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

Utilisation de la session fournie par la fonctionnalité d'authentification de ServiceStack, c'est-à-dire 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";
    }
}

Utilisation d'un type de session personnalisé avec la fonctionnalité d'authentification de ServiceStack (ce qui semble être ce que vous essayez de faire).

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

J'espère que ça aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top