在C#MVC3重用跨控制器会话(Reusing session across controllers

2019-09-17 07:07发布

我使用MVC3在C#创建一个网站。 该网站是使用Web服务客户端。 Web服务每个用户使用一个唯一的会话ID,这是考虑在每个服务调用的最后一个参数。 当你登录你的会话ID。

我能够获取会话ID,并将其保存在我的用户控制的属性:

private string Sid
{
    get
    {
        var sid = Session["Sid"];
        return sid == null ? "" : sid.ToString();
    }
    set
    {
        Session["Sid"] = value;
    }
}

在我的其他控制器我能够得到一个类似性质的会话ID(只是没有二传手),但是当它要求用户控制器做一些地方访问自己的属性来获取ID的会话是空的。

这似乎是会议没有得到控制器之间传输,但我不知道该怎么做。 我想从一个中心位置访问,而不是在每个控制器有特性的会议,但我无法弄清楚如何做到这一点。

搜索后三天谷歌一直没有能够给我答案。 你有什么想法?

Answer 1:

为什么不创建它创建的会话变量基本控制器OnActionExecuting方法,然后让你的所有其他控制器从这个基本控制器继承,就像这样:

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        Session["Sid"] = Session.SessionID;
        base.OnActionExecuting(filterContext);
    }        
}

public class HomeController : BaseController
{
    public ActionResult Index()
    {
        ViewBag.Name = Session["Sid"];
        return View();
    }
}

public class TestController : BaseController
{
    public ActionResult Index()
    {
        ViewBag.Name = Session["Sid"];
        return View();
    }
}

希望这可以帮助!

编辑

按您的评论如下这里,我相信什么,你正在寻找(?):

public class BaseController : Controller
{
    public string Sid
    {
        get
        {
            var sid = Session["Sid"];
            return sid == null ? "" : sid.ToString();
        }
        set
        {
            Session["Sid"] = value;
        }
    }
}

public class HomeController : BaseController
{
    public ActionResult Index()
    {
        Sid = "2343432233aaaa";
        ViewBag.Name = Session["Sid"];
        return View();
    }
}

public class TestController : BaseController
{
    public ActionResult Index()
    {
        ViewBag.Name = Session["Sid"];
        return View();
    }
}

您可以替换在那里我设置Sid与会话ID从服务中产生



Answer 2:

你所描述的行为是很意外; 会话肯定是一样的,所以还有别的东西造成这种行为。

然而,“正常”的方式来解决这个问题是创建一个自定义SessionWrapper。 该SessionWrapper是具有公共属性静态类,也是最重要的,它是单点在那里你会访问会话 - 因此,所有的控制器都使用这个类用于写入/从会话读取。

一个非常简单的版本将是这个样子:

public static class SessionWrapper
{
    public string Sid 
    { 
        get 
        { 
            var sid = Session["Sid"]; 
            return sid == null ? "" : sid.ToString(); 
        } 
        set 
        { 
            Session["Sid"] = value; 
        } 
    }
}


文章来源: Reusing session across controllers in C# MVC3