Qual o melhor código de auto-hospedado ServiceStack quando não podemos ter a sessão devido ao nulo pedido?

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

  •  21-12-2019
  •  | 
  •  

Pergunta

Eu estou usando ServiceStack 3.9.71.Eu estou indo para a auto-hospedado rota para ser capaz de implementar em Linux e ainda ser capaz de evitar o problemas de vazamento de memória que assola Mono.

A coisa, com o auto-serviço hospedado, é que já não temos mais o pedido.Sem ele, nós não temos sessão do bem.Tentativas para obter a sessão irá falhar com

Apenas ASP.NET Solicitações acessível através de Singletons são suportadas

devido ao nulo objeto do pedido.

As perguntas são:

  1. Alguém pode explicar por que não podemos ter a pedido, a auto-hospedado ServiceStack serviço?
  2. Como podemos contorná-lo?

Por exemplo, se o serviço precisa de saber se os detalhes do usuário (endereço de e.g que nós teríamos em ICustomAuthSession) que invocou o pedido, como podemos fazer isso?Eu posso ver que o Cache, na verdade, contém a sessão, mas como não temos o pedido, em seguida, não há SessionKey que podemos usar para pegar a sessão do Cache.De certa forma eu ver alguns discussão sobre ele, mas não consegue fazer o que fazer exatamente.

Foi útil?

Solução

Auto-hospedado ServiceStack aplicações tem acesso a Solicitação e Sessões da mesma forma que ServiceStack aplicativos do IIS fazer.

Acessando o Pedido de

Auto-hospedado uso de aplicativos de HttpListenerRequest classe para manipular as solicitações HTTP, mas ServiceStack resumos esta distância em um IHttpRequest, que fornece uma maneira consistente para acessar os dados de solicitação HTTP, entre o IIS ou o auto-aplicativos hospedados.

Se você estiver em um ServiceStack Serviço e, em seguida, você pode acessar o IHttpRequest através do base.Request objecto. Ver ServiceBase.cs para os métodos fornecidos pela base de Service.

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

Ou o objeto do pedido é fornecido a você durante o pedido de filtros:

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

    // Access to the request through httpReq 

});

É raro que você deve precisar de acesso ao original subjacente pedido, a abstração fornecida pela IHttpRequest deve cobrir, na maioria dos casos.Mas se você quisesse, por exemplo, para acesso a pedidos de certificado de cliente você pode obter este subjacente pedido.Você pode fazer isso por fundição a IHttpRequest.OriginalRequest:

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

Acessando a Sessão

Parece que você não está acessando a sessão corretamente.Se você estiver usando ServiceStack do SessionFeature, que é usado pelos AuthenticationFeature então você não precisa se preocupar sobre como obter o identificador de sessão e, em seguida, a pesquisa de valores a partir da cache do cliente, ServiceStack foi construído em métodos para o processamento de acessar a sessão.

Existem diferentes maneiras de acessar a sessão, dependendo se você estiver usando ServiceStack de autenticação que fornece ele próprio sessão de utilizador mecanismo, ou se você estiver usando o simples valor de chave de armazenamento análogo ao padrão ASP.NET valor de chave de sessão de loja.Você pode saiba mais sobre as sessões aqui.

O simples feito o cache Valor de chave de armazenamento de (Sem tipos de sessão de saco):

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

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

Usando a sessão fornecida pela ServiceStack do Recurso de Autenticação i.e. 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";
    }
}

Usando uma sessão personalizada tipo com ServiceStack do Recurso de Autenticação (que parece ser o que você está tentando fazer).

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

Espero que isso ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top