现在的位置: 首页 > 综合 > 正文

url重写(urlrewriter)引起的”未将对象引用设置到对象的实例”错误发生的原因

2012年01月25日 ⁄ 综合 ⁄ 共 2261字 ⁄ 字号 评论关闭

最近用url重写做的项目上线,发现有时会出现"未将对象引用设置到对象的实例"的错误,刷新一下页面后该错误消失,但是过段时间又会出现.中间间隔的时间不确定.
经过一天的错误捕捉,确定该错误发生的原因是由于数据缓存的丢失.通过缓存获得的数据在使用的时候变成了null,导致错误的发生.
我把缓存都注释掉了,再没有发生错误.
但是,大家看我的程序,使用缓存前刚把数据加入到了缓存,接着再立刻获取,这就出问题了?所有我怀疑是不是引用出问题了.
为了测试,我把这部分的缓存存取时设置成System.Web.Caching.CacheItemPriority.NotRemovable,这之后,就没有出现问题.
所以应该不是引用错误,而是莫名奇妙的缓存被清除了,但是强制保留缓存后,就没有问题出现.

错误记录到这里,发生的原因是什么呢?稍后研究.有明白的兄弟就来说说:)

            //ChannelIndexAreas
            if ( cacheIsInvaild ( ChannelCacheKey.ChannelIndexAreas) )
            {
                cacheAddData ( ChannelCacheKey.ChannelIndexAreas , dt , ChannelCacheKey.maxspan );
            }
            DataTable dt=cacheGetData ( ChannelCacheKey.ChannelIndexAreas );

            //ChannelIndexMoreLinks
            if ( cacheIsInvaild ( ChannelCacheKey.ChannelIndexMoreLinks ) )
            {
               cacheAddData ( ChannelCacheKey.ChannelIndexMoreLinks , dtMore , ChannelCacheKey.maxspan );
            }
            DataTable dtMore=cacheGetData ( ChannelCacheKey.ChannelIndexMoreLinks );

            //ChannelIndexSubtitles
            if ( cacheIsInvaild ( ChannelCacheKey.ChannelIndexSubtitles) )
           {
               cacheAddData ( ChannelCacheKey.ChannelIndexSubtitles, dtSubTitle , ChannelCacheKey.maxspan );
           }
           DataTable dtSubTitle=cacheGetData ( ChannelCacheKey.ChannelIndexSubtitles);

         

           // zikao _area16 isn't null cache is null: 未将对象引用设置到对象的实例
           // 错误确定为缓存丢失,可能是url重写引起的,具体原因不明
           try
           {
               switch ( item.ItemType )
               {
                   case EduShop.Main.Business.AppControl.ChannelItemType.Area:
                       fillArea ( item , dt );
                       break;
                   case EduShop.Main.Business.AppControl.ChannelItemType.SubTitle:
                       fillTitle ( item , dtSubTitle , dtMore );
                       break;
               }
           }
           catch(Exception e)
           {
               error=new Error();
               string itemnull= ( item==null?"is null":"isn't null" );

               string cachenull="cache isn't null";
               if ( dt==null || dtSubTitle==null || dtMore==null )
                   cachenull="cache is null";
               error.LogMessage=string.Format ( "{0} {1} {2}: {3} " ,  item.ID , itemnull , cachenull , e.Message );
              
               error.UserName="频道页错误收集器";
               ErrorNormal.Insert ( error);
           }

抱歉!评论已关闭.