Qual o melhor código de auto-hospedado ServiceStack quando não podemos ter a sessão devido ao nulo pedido?
-
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:
- Alguém pode explicar por que não podemos ter a pedido, a auto-hospedado ServiceStack serviço?
- 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.
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.