url重写(urlrewriter)引起的"未将对象引用设置到对象的实例"错误发生的原因
最近用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);
}