XmlSitemapProvider的Bug?

Asp.Net2.0为我们提供了Sitemap功能,并提供了一个默认的实现即XmlSitemapProvider。2.0版的XmlSitemapProvider有一个问题,即对Cookiless Sessions的支持不是很好,究其原因,是因为在Cookiless Session的情况下,SessionId是插入到Url中实现的,但是,XmlSitemapProvider却不会在每个Node的Url中插入该SessionId,这样,如果你用TreeView等控件绑定XmlSitemapProvider的Node列表的话,每个链接都不带SessionId,这样,用户一点链接,就丢失了Session。具体文章见

Avoid session loss when using Cookieless sessions with XML Sitemap Provider

Asp.Net4.0似乎在这方面做了加强。现在,如果你使用Cookiless Session,XmlSitemapProvider会自动在每个Node的Url中插入SessionId。但是,问题来了,XmlSitemapProvider的Node只生成一遍,生成后即缓存了起来,之后,及时你换了一个SessionId,每个Node的Url还是原来的那个Url,并没有根据新的SessionId做替换。而且,更严重的是,XmlSitemapProvider的CurrentNode属性再也不能正常工作了,每次都返回null。

那么我们永远不用Cookiless Session,我们只用Cookie Session行吗?我发现,一般情况下是可以的。但是,当你的WebSite刚刚启动时,第一个访问者如果使用带SessionId的Url来访问时,XmlSitemapProvider便以为你是用的Cookieless Session模式,然后在生成Node的时候,自动插入该SessionId,然后缓存。之后,你便悲剧了。

下面附上关键的原代码,该代码来自XmlSitemapProvider的BuildSiteMap及GetNodeFromXmlNode方法
image_thumb[7]

image_thumb[8]

你可能感兴趣的:(Provider)