ServiceStack会话处理需要AppHost吗?

时间:2013-09-19 15:11:26

标签: asp.net session servicestack

我成功地将ServiceStack(SS)用于标准ASP.NET网站的会话处理。这意味着没有SS Web服务或身份验证。目前,如果我初始化AppHostBase派生类并将ServiceStackHttpHandlerFactory添加到Web.config,我只能使用它。

这意味着我有效地运行了用于托管SS服务的东西,即使我没有使用它。反正有没有避免这种情况,还是会话处理依赖于AppHost运行?从源头来看,它看起来像后者,但我想查一下。

1 个答案:

答案 0 :(得分:3)

我为“依赖于答案”而道歉,但我不太确定您在当前的ASP.NET网站中使用ServiceStack会话以及您需要的SS会话的“部分”。在我看来,SS Session只是存储在缓存中的一小撮数据,具有用户(浏览器或client)请求/响应的唯一ID。

如果您对Session数据的请求通过ServiceStack管道,那么我非常有信心您需要一个AppHost实例来实现这一点。主要原因是SS需要添加请求过滤器并设置ss-id,ss-pid会话cookie。这些cookie是用于存储/检索会话数据的'Key'

如果您的请求没有通过ServiceStack管道,我会想象您编写自己的代码,使用ICacheClient的实例并提供您自己的密钥(可能使用ASP。 NET SessionID?作为密钥)和AuthUserSession的实例(或实际上是任何类/类型)。以下是非常天真示例

为要使用的应用程序设置缓存
如果您使用Redis或其他“独立服务器”缓存之类的东西,则不会使其成为应用程序上的静态变量。

public class Global : HttpApplication
{
    public static ICacheClient CacheClient; 
    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterOpenAuth();
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        CacheClient = new MemoryCacheClient();
    }
} 

从代码隐藏页面访问会话......

public partial class _Default : Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
        var session = GetOrCreateSession();
    }

    private AuthUserSession GetOrCreateSession()
    {
        var session = Global.CacheClient.Get<AuthUserSession>(this.Session.SessionID);

        if (session != null)
            return session;

        var authUserSession = new AuthUserSession();
        Global.CacheClient.Set(this.Session.SessionID, authUserSession);
        return authUserSession;
    }
}