我在 C# 和选择 xml 节点时遇到了一个有趣的问题。
我们的网站正在从经典 ASP 升级到 ASP.NET。为了在我们升级时让访问者的流程更顺畅,我实施了 404 重定向,以将访问者带到新的 .aspx,以替换旧的 .asp 页面,以应对外部链接、书签等的情况。
一些链接刚刚从 .asp 更改为 .aspx,但有些更改了结构和命名,所以我有一个遵循以下模式的 XML 文件:
<?xml version="1.0" encoding="utf-8" ?>
<links>
<link oldUrl="/jailpod/default.asp" newUrl="/about/construction/jailpod.aspx" />
<link oldURL="/boc/boards.asp" newUrl="/boc/boards/default.aspx" />
<link oldUrl="/maps.asp" newUrl="/maps/default.aspx" />
</links>
我们在 C# 代码中的自定义 404 页面使用此 XML 文件。代码通过在 XML 文件中搜索新 URL 来查找替换 URL 的过程,查看页面是否简单地更改为 .aspx,最后如果没有找到匹配项,则停留在 404 页面上,让访问者知道他们的页面不正确。
这是 C# 代码:
// Whether or not to display an additional message to the users
bool redirectVisitor = false;
string url = ExtractUrlFrom(Request.Url.ToString());
var doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load(Server.MapPath("~/inc/NewUrlDictionary.xml"));
XmlNode urlNode = doc.SelectSingleNode(
string.Format("/links/link[@oldUrl='{0}']", url));
// Check if the node existed or not
if (urlNode != null)
{
url = urlNode.Attributes["newUrl"].Value;
redirectVisitor = true;
}
else
{
....
}
}
这是问题所在。
当我访问时:
mysite/jailpod/default.asp
或者
mysite/maps.asp
如我所料,我被重定向了。
当我访问时:
mysite/boc/boards.asp
没有找到 XmlNode,因此 404 页面只是告诉我它不存在。我已经使用断点单步执行了 C# 代码,它正在搜索的 URL 正是“/boc/boards.asp”,我什至使用 Visual Studio 本地面板来查看 XmlDocument 对象的内容,它确实确实有一个具有属性“/boc/boards.asp”的节点
这不是一个节点的孤立问题,也有(看似随机的)其他节点发生。
有谁知道我在这里做错了什么?我正在考虑将所有这些 XML 记录迁移到我们的数据库中,然后只查询数据库——除非我在这里的某个地方犯了一个愚蠢的错误。