ServiceStack在进程之间共享会话

时间:2014-09-18 14:05:13

标签: servicestack asp.net-mvc-5.2

我有一个ServiceStack 4 API项目和一个MVC 5 Web项目,我希望他们能够共享用户的会话数据。

两个项目都已配置为使用相同的Redis实例作为缓存。

我的MVC控制器继承自ServiceStackController。

会话由API创建(我可以看到返回cookie并按会话ID查询对象的Redis)。

我正在努力的是MVC项目如何意识到会话ID。最初我认为JsonServiceClient上的ShareCookiesWithBrowser可能会做到这一点,但似乎没有。

所以,我已经向JsonServiceClient添加了Request和Response过滤器,以将网站的cookie添加到API请求中,并将API响应cookie添加到网站响应cookie中。这似乎在API调用和Web请求ss-id和ss-pid cookie匹配的意义上起作用,并且会话对象在Redis中可用。不幸的是,当我在MVC控制器上调用UserSession属性时(来自ServiceStackController基础),抛出NullReferenceException。

如果有人能让我知道我错过了什么或做错了什么,那就非常感激了。

更新

刚刚发现ServiceStackController上的Cache属性为null。我想这通常是由Funq注入的属性,但我们使用SimpleInjector并避免注入属性。

知道我是否必须通过JsonServiceClient来回手动传递cookie仍然是一件好事。对于像ServiceStack一样深思熟虑的东西来说,这似乎有些苛刻 - 我仍然情不自禁地认为我错过了一些东西。

谢谢,

史蒂夫。

1 个答案:

答案 0 :(得分:0)

您不需要使用HTTP服务客户端从MVC调用ServiceStack服务,因为您可以直接使用C#调用ServiceStack服务。以下是新ServiceStack + MVC test project显示如何登录的一些示例:

public ActionResult Login(string userName, string password, string redirect=null)
{
    if (ModelState.IsValid)
    {
        try
        {
            using (var authService = ResolveService<AuthenticateService>())
            {
                var response = authService.Authenticate(new Authenticate
                {
                    provider = CredentialsAuthProvider.Name,
                    UserName = userName,
                    Password = password,
                    RememberMe = true,
                });

                // add ASP.NET auth cookie
                FormsAuthentication.SetAuthCookie(userName, true);

                return Redirect(string.IsNullOrEmpty(redirect) ? "/" : redirect);
            }
        }
        catch (Exception ex)
        {
            ModelState.AddModelError("", ex.Message);
        }
    }

    var session = SessionAs<CustomUserSession>();
    return View("Index", session);
}

退出:

public ActionResult Logout()
{
    using (var authService = ResolveService<AuthenticateService>())
    {
        var response = authService.Authenticate(new Authenticate {
            provider = AuthenticateService.LogoutAction,
        });

        // add ASP.NET auth cookie
        FormsAuthentication.SignOut();
    }

    return Redirect("/");
}

您可以使用部署在http://mvc.servicestack.net/的MVC测试项目 - 它显示从MVC登录,注销和访问ServiceStack的类型会话。

同时查看项目中的Session Services,其中显示了如何在Custom UserSession的OnAuthenticated()事件中检索,编辑和添加自定义逻辑,以将未经身份验证的会话数据复制到经过身份验证的类型会话为described in this earlier answer

此项目确实利用了现在available on MyGet v4.0.32 + 中添加的一些较新的API。