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缓存,即使我知道性能会受到影响。
任何想法?非常感谢大家的帮助
你的做法不对。您应该拥有自己的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/