Проблема с IHttpHandler и относительными URL - PullRequest
0 голосов
/ 27 мая 2010

Я разработал класс IHttpHandler и настроил его как verb="*" path="*", поэтому я обрабатываю весь запрос вместе с ним, пытаясь создать собственную реализацию REST для тестового веб-сайта, который генерирует HTML динамически.

Итак, когда приходит запрос на файл .css, я должен сделать что-то вроде context.Response.WriteFile(Server.MapPath(url)) ... то же самое для картинок и т. Д., Я должен ответить на все сам.

Моя главная проблема, когда я помещаю относительные URL в якоря; например, у меня есть главная страница с такой ссылкой <a href="page1">Go to Page 1</a>, а на странице 1 есть другая ссылка <a href="page2">Go to Page 2</a>. Предполагается, что страницы 1 и 2 находятся на одном уровне (http://host/page1 и http://host/page2, но когда я нажимаю на Перейти на страницу 2, я получаю этот URL в обработчике: ~/page1/~/page2 ... что такое боль, потому что я должен сделать url = url.SubString (url.LastIndexOf ('~')) для очистки, хотя я чувствую, что в этом нет ничего плохого, и это поведение абсолютно нормально.

Прямо сейчас я могу справиться с этим, но я думаю, что в будущем это принесет мне головную боль. Я пытался установить все ссылки с абсолютными URL-адресами, используя информацию context.Request.Url, но это также является болью: D, поэтому я хотел бы знать, есть ли лучший способ сделать такие вещи.

Не стесняйтесь давать мне довольно очевидные ответы, потому что я довольно новичок в веб-разработке и, возможно, я пропускаю что-то базовое в URL, Http и т. Д.

Заранее спасибо и всего наилучшего.

1 Ответ

2 голосов
/ 19 декабря 2010

Прежде всего, я бы посмотрел на выходной HTML, доставленный в браузер, и, в частности, на ссылки, которые вы описываете.

Вы говорите, что ссылка <a href="page2">Go to Page 2</a>, но в соответствии с вашим результатом я быдумаю, это больше похоже на <a href="~/page2">Go to Page 2</a>.Вы можете подтвердить это, поместив точку торможения в обработчик, и когда она сработает с "~ / page1 / ~ / page2", посмотрите в адресной строке вашего браузера, и она должна сказать что-то вроде "http://www.example.com/page1/~/page2"

. Сначала вы должны посмотретьв коде, генерирующем ссылку. Если она генерируется с помощью какого-либо вызова функции, убедитесь, что вы получаете веб-адрес, а не адрес скрипта.

В любом случае ссылки такого рода, которые переключаются между страницами первого уровнявсе должны начинаться с символа "/", указывающего, что их расположение относительно корня вашего сайта, а не относительно текущей показанной страницы.

...