【问题标题】:How to use the asp.net mvc session in service stack without authentication mechanism如何在没有身份验证机制的服务堆栈中使用 asp.net mvc 会话
【发布时间】:2014-04-02 13:24:02
【问题描述】:

我正在研究 Asp.Net MVC 和服务堆栈。我正在尝试实现这一点,在服务堆栈服务类中使用 asp.net mvc 会话。也就是说,

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

从现在开始,我需要能够在服务堆栈服务类中使用Session["username"],但我无法在服务堆栈服务类中使用会话。 HttpContext.Current.Session 抛出空异常。我已经提到了 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 会话。请指导我。

【问题讨论】:

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


    【解决方案1】:

    需要了解的一个重要区别是,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();
        }
    }
    

    这利用了在base.Cache 属性中注入的注册ICacheClient 提供程序。您可以使用 ServiceStack 的 IOC 通过设置 MVC 的 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 的更多信息,请参阅 wiki。

    在 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"];
        }
    }
    

    【讨论】:

    • 感谢您的回复.. 它非常有用。但我需要在服务堆栈服务类中使用 asp.net mvc 会话。这意味着在 asp.net mvc 控制器中创建的会话需要在服务堆栈服务类中使用它。请指导我。
    • @KarthikBammidi ok 添加了如何从 ServiceStack 内部访问 ASP.NET 请求和会话。
    • HttpContext.Current.SessionaspReq.RequestContext.HttpContext.Session 始终为空,如何为 ServiceStack 启用会话状态?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2010-12-16
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多