У меня возникла интересная проблема с C# и последовательным выбором узлов xml.XmlDocument.SelectSingleNode не всегда работает точно
Наш сайт находится в процессе обновления от классического 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>
этот XML-файл, используемый на странице 404 в C# код позади , Код проходит процесс поиска нового URL-адреса путем поиска нового в файле XML, видя, была ли страница просто изменена на .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/ВОС/boards.asp
Нет XmlNode не найден, и, таким образом, 404 страница просто говорит мне, что он не существует. Я прошел через код C#, используя точку останова, и URL-адрес, который он ищет, это именно «/boc/boards.asp», и я даже использовал панель локалей Visual Studio для просмотра содержимого объекта XmlDocument, и это действительно есть узел с атрибутом «/boc/boards.asp»
Это не изолированная проблема с этим одним узлом, есть (казалось бы, случайные) другие узлы, где это происходит.
Кто-нибудь знает, что я делаю неправильно здесь? Я рассматриваю возможность переноса всех этих записей XML в нашу базу данных и вместо этого просто запрашиваю базу данных - если только я не делаю глупую ошибку где-то здесь.
Я удалил большую часть несвязанного кода ... Обратите внимание, что в дополнение к неправильным именам атрибутов (как говорят ответы) вы сталкиваетесь с чувствительным к регистру сопоставлением URL-адресов - если вам не нравится случай с URL-адресами, я бы рекомендовал нормализовать их до согласованного случая перед поиском в XML или даже лучше использовать LINQ to XML и искать в случае нечувствительного сравнения. –
Благодарим вас за ввод. Я действительно имею все нижеследующие случаи в своем XML-документе, но это не мешает посетителям предоставлять верхний регистр - я буду использовать .ToLower() на url, который я предоставляю в качестве условия поиска, чтобы избежать несоответствий, чувствительных к регистру. Я взгляну на LINQ to XML; Я еще не использовал его, но мне очень нравится LINQ, поэтому я отдам ему все. – Jeremy
@AlexeiLevenkov Кроме того, я применил метод ExtractUrlFrom(), который вы указали в моем примере с обрезанным кодом. Еще раз спасибо! – Jeremy