c# - session 对象在 Azure 上变为 null

标签 c# asp.net-mvc azure session

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

我决定将整个东西安装在 Microsoft Azure 上。我的 Session 对象由于某种原因变为 null,导致 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;
    }

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

公开课客户业务 { 内部 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

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

有什么想法吗?我真的很感谢你们的帮助

最佳答案

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

这里有几个选项:

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

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/

关于c# - session 对象在 Azure 上变为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39928976/

相关文章:

c# - WPF 绑定(bind) : Where a property contains the path to the value

c# - 同一个表的多个外键具有级联更新和删除

asp.net-mvc - CaSTLe Windsor 无法在中等信任下运行

c# - ASP.NET MVC - 模型绑定(bind)不同实体中具有相同名称的多个参数 - GET 和 POST 不同吗?

azure - 如何从快速 SSL 中仅从 .CER 获取 .PFX 文件

c# - 如何在 Silverlight 中使用 OpenXml (Office)?

c# - WPF 网格不同的列大小和位置

c# - MVC 5 路由属性

azure - 从函数应用程序中运行 New-AzureRmResourceGroupDeployment

azure - 我可以使用 Azure 构建 iOS/Android 应用程序吗?