Session对象在Azure上变为空

本文关键字:Azure 对象 Session | 更新日期: 2023-09-27 18:12:18

所以,我在c#上开发了一个MVC应用程序。

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

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

    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;internal 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操作中记录userName。

这是我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

这是如此令人沮丧,我正在考虑使用DB缓存,即使我知道性能会受到影响。

任何想法?非常感谢大家的帮助

Session对象在Azure上变为空

你的做法不对。您应该拥有自己的State Server,而不是将会话存储在web服务器上。使用Azure的想法是在需要时添加弹性规模。

这里有几个选项:

1-添加Azure Redis Cache,让它成为你的会话管理器到你的web应用程序的所有实例;

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

2-使用Sql Database管理状态

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