所以,我在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数据库。这是一张图片:
令人沮丧的是,我正在考虑使用数据库缓存,即使我知道性能会受到影响。
有什么想法吗?我真的很感谢你们的帮助
答案 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/