因此,我在 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。这是一张图片:
这太令人沮丧了,以至于我正在考虑使用数据库缓存,即使我知道性能会受到影响。
有什么想法吗?我真的很感谢你们的帮助
最佳答案
你的做法是错误的。您应该拥有自己的状态服务器,而不是将 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/