【问题标题】:Session object becomes null on Azure会话对象在 Azure 上变为空
【发布时间】:2017-02-17 03:29:45
【问题描述】:

所以,我在 C# 上使用 MVC 开发了一个应用程序。一切都在本地完美运行。

我决定将整个东西安装在 Microsoft Azure 上。我的 Session 对象由于某种原因变为 null,导致会话由于我的验证而过期。这是随机的,有时几秒钟后,有时一分钟后。我确信这不是因为不活动的时间,因为它发生在我点击事物时。

这是我创建对象的登录方法:

    public ActionResult Login(MyWebApplication.Models.LoginRQ User)
    {
        if (ModelState.IsValid)
        {
            MyWebApplication.Models.LoginRS login = new MyWebApplication.Models.LoginRS();
            try
            {
                MyWebApplication.LoginBusiness LoginProxy = new MyWebApplication.LoginBusiness();
                login = LoginProxy.Login(User);

                if (login.Logged == false)
                {
                    ViewBag.MessageError = Wrong user";
                }

                Session["InfoUser"] = login;
                return RedirectToAction("Index","Inicio");
            }
            catch (Exception ex)
            {
                ViewBag.MessageError = ex.Message;
            }

        }
        return View(User);
    }

这是我对每种方法的验证:

    public static bool ValidateSession(MyWebApplication.Models.LoginRS InfoUser)
    {
        if (InfoUser == null)
        {
            throw new ArgumentException("SESSION EXPIRED");
        }
        return true;
    }

我在从业务层实例化方法时使用此验证。例如,这是我的 Customer CRUD 业务层:

公共类 CustomerBusiness { 内部 MyWebApplication.Models.LoginRS InfoUser; 内部 MyWebApplication.Models.Customer OBJRES_Residentes = new MyWebApplication.Models.Customer();

    [Logger]
    public CustomerBusiness(MyWebApplication.Models.LoginRS InfoUser)
    {
        MyWebApplication.LoginBusiness.ValidateSession(InfoUser);
        this.InfoUser = InfoUser;
    }

} 如您所见,我需要 InfoUser,因此我在 CRUD 操作中记录了用户名。

这是我的 WebConfig 的一部分:

  <system.web>
    <sessionState mode="InProc" timeout ="20" cookieless="false"></sessionState>
    <customErrors mode="Off">
    </customErrors>
  </system.web>

不,让我们谈谈我是如何在 Azure 上配置它的。我创建了一个 WebApplication 和一个 SQL Server Azure DB。这是一张图片:

Azure_Portal

这太令人沮丧了,以至于我正在考虑使用数据库缓存,即使我知道性能会受到影响。

有什么想法吗?非常感谢你们的帮助

【问题讨论】:

  • 这个验证方法在哪里调用?
  • 如果你改用 system.web.httpcontext.current.session 会发生什么?
  • 您是如何部署的:Web 应用程序?您如何管理您的会话:进程内?请编辑您的问题并提供更多详细信息。
  • 朋友们好。感谢您的回答。我用更多细节更新了我的问题。谢谢

标签: c# asp.net-mvc azure session


【解决方案1】:

你做错了。您应该拥有自己的状态服务器,而不是将会话存储在 Web 服务器上。使用 Azure 的想法是在需要时添加弹性缩放。

这里有几个选项:

1-添加 Azure Redis 缓存并使其成为 Web 应用所有实例的会话管理器;

https://azure.microsoft.com/en-us/documentation/articles/cache-aspnet-session-state-provider/

2-使用Sql数据库管理状态。

https://azure.microsoft.com/en-us/blog/using-sql-azure-for-session-state/

【讨论】:

  • 我同意。如果他有多个实例,则不能保证 Azure 总是将请求路由到创建会话的实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 2020-09-21
  • 1970-01-01
  • 2011-12-09
相关资源
最近更新 更多