为什么会话变量在登台服务器中丢失,但在localhost中工作正常?

时间:2017-02-01 21:34:49

标签: c# asp.net-mvc session iis-7

我在搜索,分页,排序时应保留所有搜索条件。它在我的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中的

会话状态

Session state

将IIS中的会话状态模式 SQL Server 更改为正在处理将解决此问题。但它不是负载平衡服务器的首选解决方案。

1 个答案:

答案 0 :(得分:0)

MSDN参考:Session-State Modes

对于负载均衡服务器,我们必须使用SQL Server会话状态模式,而不是进程内模式

SQL Server模式部分的本文中,有一个非常重要的注意事项:

  

如果模式是SQL Server,则存储在会话状态中的对象必须是可序列化的。有关可序列化对象的信息,请参阅SerializableAttribute类。

这就是问题所在。

如果搜索视图模型顶部没有[Serializable]属性,则无法正确保存视图模型。在会话请求之间会丢失该会话变量。

所以修复是:

[Serializable]
public class SearchInputModel
{
    ...
}