当我们因空请求而无法进行会话时,如何最好地在自托管ServiceStack中进行编码?

时间:2014-07-31 02:22:34

标签: servicestack servicestack-bsd

我正在使用ServiceStack 3.9.71。我要进入自托管路由以便能够在Linux上部署,但仍然可以避免使用memory leak issues plaguing Mono

自托管服务的事情是我们不再有请求。没有它,我们也没有会话。尝试获取会话将失败

  

仅支持通过单身人士访问的ASP.NET请求

由于null请求对象。

问题是:

  1. 有人可以解释为什么我们无法在自托管ServiceStack服务中获得请求吗?
  2. 我们如何解决这个问题?
  3. 例如,如果服务需要知道调用请求的用户的详细信息(例如我们在ICustomAuthSession中会有什么),我们该怎么做?我可以看到缓存实际上包含会话,但由于我们没有请求,因此我们没有可以用来从缓存中获取会话的SessionKey。我有点看到它上面有一些discussion,但是不能确切地知道该怎么做。

1 个答案:

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

我希望这会有所帮助。