我成功地将ServiceStack(SS)用于标准ASP.NET网站的会话处理。这意味着没有SS Web服务或身份验证。目前,如果我初始化AppHostBase派生类并将ServiceStackHttpHandlerFactory添加到Web.config,我只能使用它。
这意味着我有效地运行了用于托管SS服务的东西,即使我没有使用它。反正有没有避免这种情况,还是会话处理依赖于AppHost运行?从源头来看,它看起来像后者,但我想查一下。
答案 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;
}
}