在MVC4和类库之间共享会话的最佳方式

时间:2013-08-31 20:59:41

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

背景

ASP.NET会话状态使您能够在用户在Web应用程序中导航ASP.NET页面时存储和检索用户的值。这适用于该应用程序但是当我们在该应用程序中引用了一个类库并且我们在该库中需要Session Variables时,我必须将它传递给每个方法,因为我没有使用依赖注入。

问题:

我有一个控制器可以进行Facebook身份验证,如下所示:

 public class FacebookController : Controller
    {
        private FacebookGateway FacebookGateway = new FacebookGateway();

        // GET: /Facebook/

        public ActionResult Index()
        {
            string code = Request.QueryString["code"];
            TokenResponse tokenResponse = FacebookGateway.GetTokenResponse(code);
            Session["AccessToken"] = tokenResponse.Access_token;
            return View();
        }

        public ActionResult Friends()
        {

            string accessToken = Session["AccessToken"].ToString();

            WebRequest request = WebRequest.Create(instanceUrl + @"profileUrl-Here");
            request.Method = "GET";
            request.Headers.Add("Some Header " + accessToken);
            WebResponse response = request.GetResponse();
            string str = String.Empty;

            if (response == null)
            {
            }
            else
            {
                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                    str = sr.ReadToEnd().Trim();

            }
           //Convert str to Model
            return View(model);
        }

在这里,几乎每种方法我都需要访问令牌来从Facebook Graph API进行数据访问,但是,我必须每次从会话中获取它,如下所示

 var accessToken = Session["AccessToken"].ToString();

如何使其可用于控制器中的所有方法?

有没有办法在MVC和类库之间共享会话而不在类库的每个方法调用中传递HttpContext.Session

注意: 我看过this answer,但是在类库中它是如何可用的还不太清楚。

1 个答案:

答案 0 :(得分:8)

this answer(您提及的那个)相关:

您可以将会话包装器(即MySession类)放入类库中。这样,它可以被类库中的代码以及Web应用程序中的代码使用。

通常,您可以使用System.Web.HttpContext.Current.Session["AccessToken"]从任何地方访问会话状态。即使没有任何包装类,这也可以工作。