【问题标题】:Is AppHost needed for ServiceStack session handling?ServiceStack 会话处理是否需要 AppHost?
【发布时间】:2023-04-08 09:14:02
【问题描述】:

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

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

【问题讨论】:

  • 为什么不直接使用ASP.NET sessions
  • 主要是因为我们遇到了herehere 所述的线程敏捷性问题。 SS 的乐观会话处理适合我们的应用程序。我们还在另一个应用程序上以更传统的方式非常成功地使用了 SS,并且可能会开始在这个问题中提到的网站中使用它的更多功能。

标签: asp.net session servicestack


【解决方案1】:

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

如果您对 Session 数据的请求通过 ServiceStack 管道,那么我非常有信心您需要一个 AppHost 实例才能使其工作。主要原因是SS需要添加一个Request Filter并设置ss-id、ss-pid session cookies。这些 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;
    }
}

【讨论】:

  • 谢谢,这是正确的。如果不启动 AppHostBase 派生类,就不能使用 SS 的会话处理。该代码包含对 EndPointHost 的各种引用(例如在 Cookies 类中),这些引用依赖于它。任何解决方案都将涉及重写大量代码,以至于您将有效地创建自己的会话处理。 @paaschpa 建议的解决方案是有道理的,但当然你没有使用 SS 的会话处理,只是它的缓存。我们现在选择只启动 AppHostBase 派生类,因为开销几乎没有。
猜你喜欢
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 2011-01-22
  • 2015-01-05
  • 2022-01-09
  • 2013-02-03
  • 2017-05-17
  • 1970-01-01
相关资源
最近更新 更多