我成功地将 ServiceStack (SS) 用于标准 ASP.NET 网站的会话处理。所以这意味着没有 SS Web 服务或身份验证。目前,我只有在初始化 AppHostBase 派生类并将 ServiceStackHttpHandlerFactory 添加到 Web.config 时才能使用它。
这意味着我正在有效地运行旨在托管 SS 服务的东西,即使我没有使用它。有没有办法避免这种情况,或者会话处理是否依赖于 AppHost 的运行?从源头上看,它看起来像后者,但我想检查一下。
我成功地将 ServiceStack (SS) 用于标准 ASP.NET 网站的会话处理。所以这意味着没有 SS Web 服务或身份验证。目前,我只有在初始化 AppHostBase 派生类并将 ServiceStackHttpHandlerFactory 添加到 Web.config 时才能使用它。
这意味着我正在有效地运行旨在托管 SS 服务的东西,即使我没有使用它。有没有办法避免这种情况,或者会话处理是否依赖于 AppHost 的运行?从源头上看,它看起来像后者,但我想检查一下。
对于使用“取决于答案”的做法,我深表歉意,但我不太确定您如何在当前的 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;
}
}