如何在没有认证机制的服务栈中使用asp.net mvc会话

时间:2014-04-02 13:24:02

标签: c# asp.net-mvc asp.net-mvc-4 session servicestack

我正在研究Asp.Net MVC和服务堆栈。我正在尝试实现它,在服务堆栈服务类中使用asp.net mvc会话。这意味着,

Public ActionResult Index()
{
    Session["username"]="xxx";
    return View();
}

从现在开始我需要能够在服务堆栈服务类中使用Session["username"],但我无法在服务堆栈服务类中使用会话。 HttpContext.Current.Session抛出null异常。我参考了Social Bootstrap Api服务堆栈示例项目,因为它们使用CustomUserSession类,这意味着在认证之后它们会将数据存储到会话中,如

Plugins.Add(new AuthFeature(
                () => new CustomUserSession(), //Use your own typed Custom UserSession type
                new IAuthProvider[] {
                    new CredentialsAuthProvider()
}));

但是在我的应用程序中没有身份验证机制,但我需要将一些信息存储到会话中并在服务堆栈服务类中使用该会话。

要启用服务堆栈中的会话而不使用身份验证,

Plugins.Add(new SessionFeature());

所以如何在服务堆栈中使用asp.net mvc会话而不进行身份验证。请指导我。

1 个答案:

答案 0 :(得分:3)

要了解的一个重要区别是,ServiceStack Sessions是完全独立的,并且与ASP.NET会话无关(除了名称)。在大多数情况下,Sessions in ServiceStack只是存储在已注册的缓存提供程序中的blob,并使用随每个HTTP请求一起发送的SessionId Cookie进行引用。

在ASP.NET MVC中访问ServiceStack会话的最简单方法是扩展ServiceStackController并使用SessionAs<T>()方法访问您键入的会话,例如:

public class MyMvcController : ServiceStackController
{
    public ActionResult Index()
    {
        MyUserSession myServiceStackSession = base.SessionAs<MyUserSession>();

        return View();
    }
}

这使用注册在ICacheClient属性中的已注册base.Cache提供程序。您可以使用ServiceStack的IOC通过设置MVC&#39; s SetControllerFactory()来自动装配具有在ServiceStack的IOC中注册的依赖项的ASP.NET MVC控制器,例如:

public override void Configure(Funq.Container container)
{
    //Set MVC to use the same Funq IOC as ServiceStack
    ControllerBuilder.Current.SetControllerFactory(
        new FunqControllerFactory(container));
}

否则,如果要为ASP.NET MVC控制器和ServiceStack使用不同的IOC,则需要在MVC IOC中注册在ServiceStack的IOC中注册的相同ICacheClient Provider 。如果没有注册CacheClient,ServiceStack默认使用MemoryCacheClient

有关整合ServiceStack with ASP.NET MVC的详情,请参阅维基。

在ServiceStack服务中访问ASP.NET请求和会话

在ASP.NET上托管时,您可以使用以下命令访问基础ASP.NET请求:

public class MyServices : Service
{
    public object Any(MyRequest request)
    {
        var aspReq = base.Request.OriginalRequest as HttpRequestBase;
        if (aspReq != null)
        {
            var value = aspReq.RequestContext.HttpContext.Session["key"];
        }

        //or if you prefer via the ASP.NET Singleton:
        var value = HttpContext.Current.Session["key"];
    }
}