1

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

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

4

1 回答 1

3

对于使用“取决于答案”的做法,我深表歉意,但我不太确定您如何在当前的 ASP.NET 网站中使用 ServiceStack 会话,以及您需要哪些 SS 会话“部分”。在我看来,SS 会话只是存储在缓存中的数据块,具有用于用户(浏览器或客户端)请求/响应的唯一 ID。

如果您对 Session 数据的请求通过 ServiceStack 管道,那么我非常有信心您需要一个 AppHost 实例才能使其正常工作。主要原因是SS需要添加一个Request Filter并设置ss-id、ss-pid session cookies。这些 cookie 是存储/检索会话数据的“关键”

如果您的请求不通过 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;
    }
}
于 2013-09-23T17:03:24.617 回答