我在搜索,分页,排序时应保留所有搜索条件。它在我的localhost中工作正常。但是,在将页面发布到我的登台服务器之后,每次调用ChangeSort
时,会话变量SearchOptions
都会重置为null
。
IIS中有什么特别的东西搞砸了我的会话变量吗?
下面粘贴代码:
public SearchInputModel SearchOptions
{
get { return SessionValues.Search; }
set { SessionValues.Search = value; }
}
public RedirectToRouteResult ChangeSort(string sortCase)
{
if (SearchOptions == null) return RedirectToAction("Index");
switch (sortCase)
{
case "ConfirmationNumber":
{
SearchOptions.Sort = (SearchOptions.Sort == SortEnum.ConfirmationNumberAscending)
? SortEnum.ConfirmationNumberDescending
: SortEnum.ConfirmationNumberAscending;
break;
}
case "LicenseNumber":
{
SearchOptions.Sort = (SearchOptions.Sort == SortEnum.LicenseNumberAscending)
? SortEnum.LicenseNumberDescending
: SortEnum.LicenseNumberAscending;
break;
}
case "Date":
{
SearchOptions.Sort = (SearchOptions.Sort == SortEnum.DateAscending)
? SortEnum.DateDescending
: SortEnum.DateAscending;
break;
}
default:
{
SearchOptions.Sort = SortEnum.NoSorting;
break;
}
}
return RedirectToAction("Index");
}
SessionValues
类是我用来读/写会话变量的。
public class SessionValues
{
public static string Search
{
get
{
if (HttpContext.Current.Session["Search"] == null)
return null;
return (string)HttpContext.Current.Session["Search"];
}
set
{
HttpContext.Current.Session["Search"] = value;
}
}
}
}
在 Global.asax.cs 中,我有一些代码可以检查是否有Session_Start()
个事件。
protected void Session_Start()
{
//some code to write to log file.
}
没有记录任何内容,确认没有会话重置。
IIS中的会话状态:
将IIS中的会话状态模式从 SQL Server 更改为正在处理将解决此问题。但它不是负载平衡服务器的首选解决方案。
答案 0 :(得分:0)
MSDN参考:Session-State Modes
对于负载均衡服务器,我们必须使用SQL Server会话状态模式,而不是进程内模式。
在 SQL Server模式部分的本文中,有一个非常重要的注意事项:
如果模式是SQL Server,则存储在会话状态中的对象必须是可序列化的。有关可序列化对象的信息,请参阅SerializableAttribute类。
这就是问题所在。
如果搜索视图模型顶部没有[Serializable]
属性,则无法正确保存视图模型。在会话请求之间会丢失该会话变量。
所以修复是:
[Serializable]
public class SearchInputModel
{
...
}