Azure

时间:2016-10-08 05:22:36

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

所以,我在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操作上记录userName。

这是我的WebConfig的一部分:

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

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

Azure_Portal

令人沮丧的是,我正在考虑使用数据库缓存,即使我知道性能会受到影响。

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

1 个答案:

答案 0 :(得分:2)

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

这里有几个选项:

1 - 添加Azure Redis缓存并将其作为您的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/