我正在使用ServiceStack 3.9.71。我要进入自托管路由以便能够在Linux上部署,但仍然可以避免使用memory leak issues plaguing Mono。
自托管服务的事情是我们不再有请求。没有它,我们也没有会话。尝试获取会话将失败
仅支持通过单身人士访问的ASP.NET请求
由于null请求对象。
问题是:
例如,如果服务需要知道调用请求的用户的详细信息(例如我们在ICustomAuthSession中会有什么),我们该怎么做?我可以看到缓存实际上包含会话,但由于我们没有请求,因此我们没有可以用来从缓存中获取会话的SessionKey。我有点看到它上面有一些discussion,但是不能确切地知道该怎么做。
答案 0 :(得分:1)
自托管ServiceStack应用程序可以像ServiceStack IIS应用程序一样访问请求和会话。
自托管应用程序使用HttpListenerRequest
类来处理HTTP请求,但ServiceStack将其抽象为IHttpRequest
,这提供了在IIS或IIS之间访问HTTP请求数据的一致方法自托管应用程序。
如果您在ServiceStack服务中,则可以通过IHttpRequest
对象访问base.Request
。 有关Service
基础提供的方法,请参阅ServiceBase.cs。
public class MyService : Service
{
// Your action method
public object Get(MyRequest request)
{
// Access to the request
var request = base.Request;
}
}
或者the request filters期间提供了请求对象:
this.RequestFilters.Add((httpReq, httpResp, requestDto) => {
// Access to the request through httpReq
});
您很少需要访问原始基础请求,因为在大多数情况下IHttpRequest
提供的抽象应该涵盖您。但是如果你想要,例如访问请求客户端证书,你可以从底层请求中获取。您可以通过转换IHttpRequest.OriginalRequest
:
var originalRequest = IHttpRequest.OriginalRequest as HttpListenerRequest;
if(originalRequest != null)
{
// Example of accessing the client certificate
var certificate = originalRequest.GetClientCertificate();
}
听起来你没有正确访问会话。如果您正在使用SessionFeature
使用的ServiceStack AuthenticationFeature
,那么您不必担心检索SessionId,然后从缓存客户端查找值,ServiceStack内置了处理访问会话的方法。
根据您是否使用提供自己的用户会话机制的ServiceStack身份验证,或者您是否使用类似于标准ASP.NET密钥值的简单密钥值存储,有不同的方法来访问会话会话商店。你可以learn more about sessions here。
支持简单缓存Key Value store(无类型会话包):
public class MyService : Service
{
public object Get(MyRequest request)
{
// Set
Session.Set<int>("Age",123);
// Retrieve
var age = Session.Get<int>("Age");
}
}
使用ServiceStack的身份验证功能提供的会话,即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";
}
}
将自定义会话类型与ServiceStack的身份验证功能一起使用(这似乎是您尝试执行的操作)。
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; }
}
我希望这会有所帮助。