如果工作进程回收,则ViewState变量会中断

时间:2012-05-04 21:40:47

标签: asp.net viewstate

我有以下属性来保存ViewState中的某些页面级别信息:

protected ViewStateModel Model
    {
        get
        {
            if (_pageModel == null)
            {
                _pageModel = (ViewStateModel) ViewState[_pageModelKey];
                if (_pageModel == null)
                {
                    _pageModel = new ViewStateModel();
                    ViewState[_pageModelKey] = _pageModel;
                }
            }

            return _pageModel;
        }
        set
        {
            ViewState[_pageModelKey] = _pageModel = value;
        }
    }

这很有效,直到IIS工作进程再循环。我得到了

  

无法将“ViewStateModel”类型的对象强制转换为“ViewStateModel”

现在,如果我调试,我看到ViewState仍然包含ViewStateModel类型的对象及其所有值,但是当我将其类型与我定义的Model类进行比较时,它返回false

// this always returns false if the worker process has been recycled
  ViewState[_pageModelKey] is ViewStateModel  

2 个答案:

答案 0 :(得分:1)

IIS工作进程回收不应该影响ViewState。回收可以影响SessionApplication状态,但ViewState只是页面上的加密隐藏字段。如果它影响ViewState,您很可能会得到以下异常:

  

ViewState对此页面无效,可能已损坏。

查看此支持article,看看是否有任何建议有帮助。

答案 1 :(得分:0)

问题不在于ViewState。问题是如果没有正确理解后果,我在同一个aspx页面中定义了ViewStateModel类。由于aspx文件夹被编译成具有随机名称的dll,ViewState中的序列化类可能会变为无效,如果文件夹被重新编译,甚至跨Web场中的服务器。根据{{​​3}}

  

对象的公共和私有字段以及类的名称(包括包含该类的程序集)将转换为字节流

因此,由于dll的名称不相同,因此反序列化失败。正确的做法是将所有模型定义在App_Code或完全不同的类项目中的单独类文件中