Размещение почты на переписанный URL на IIS 6 не работает - PullRequest
0 голосов
/ 18 декабря 2009

Я работаю над сайтом, который запрограммирован на C # .net. Он использует CMS под названием ADX Studio (решение, которое предшествовало моему времени там), который предоставляет краткую форму перезаписи URL (насколько я могу сказать, это работает, назначая страницу aspx в качестве обработчика 404 по умолчанию в IIS). * * 1003

У меня есть веб-форма, которая живет по переписанному URL. Я отредактировал его так, чтобы действие HTML-формы указывало на переписанный URL-адрес:

var u = new Uri(Request.RawUrl.Split(new char[1] { ';' }).Last());
userAdminForm.Action = u.PathAndQuery;

(отчасти уродливо, но работает исходя из того, что Request.RawUrl есть на этих переписанных URL).

«Красивый» URL выглядит примерно так:

http://www.site.com/admin/user/edit/

В моем окне разработки (Windows XP / IIS 5), когда я первоначально пытался отправить обратно по URL-адресам, я получил ошибку HTTP 405. Я обошел это, добавив отображение сценария, чтобы Aspnet_isapi.dll обрабатывал все (*) запросы . И все отлично работает на моей машине разработки.

Я только что отправил свои изменения на работающий сервер (Windows Server 2003 R2 и IIS 6), и сообщение молча провалилось. Страница обновляется, но вся моя логика (из пути IsPostBack в коде) не попадает в цель. Ошибки не отображаются, просто не работает.

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

Мне не хватает простого способа заставить это работать? Я не хочу переключать метод перезаписи URL или что-либо еще, поскольку это большой устаревший сайт, и, к сожалению, он сильно зависит от ADX Studio, поэтому я не хочу делать ничего, что могло бы его сломать.

[отредактировано, потому что код выше потерял свою code подсветку]

Ответы [ 3 ]

0 голосов
/ 23 декабря 2009

Кажется, что проблема такая же, как и в IIS 5. Я могу заставить ее работать, выполнив следующие действия в диспетчере IIS:

  • Щелкните правой кнопкой мыши по соответствующему веб-сайту и выберите «Свойства»
  • Выберите вкладку «Домашний каталог»
  • Нажмите «Конфигурация» внизу в «Настройках приложения»
  • Нажмите «Вставить» рядом с «Карты приложения с подстановочными знаками»
  • Перейдите к местоположению aspnet_isapi.dll (в моем случае: C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_isapi.dll)
  • Снимите флажок «Проверить, существует ли файл»
  • Нажмите «ОК» обратно через русскую куклу диалогов.

Это в основном то же самое, что подход, который я привел в вопросе для IIS5. Однако это не оптимально, потому что IIS выполняет каждый запрос через asp (даже статические файлы). Кажется, что это может только замедлить ход событий. Я хотел бы иметь возможность указать, что asp нужно вызывать только для запросов HTTP POST, по крайней мере.

Странная вещь в том, что IIS5 выдал ошибку HTTP 405 при отправке сообщения на расширение без зарегистрированного расширения ISAPI, но IIS6 просто молча завершается сбоем. И страница запускается через IIS (я могу отладить с точкой останова в функции Page_Load), но IsPostBackIsCrossPagePostBack) не установлены правильно. Может ли это быть связано с состоянием просмотра? Есть ли альтернатива моему решению, описанному выше?

0 голосов
/ 27 декабря 2009

Я пришел к тому, что считаю оптимальным решением этой проблемы. Оказывается, что ADXStudio CMS действительно использует правило 404 по умолчанию, чтобы выполнить некоторую форму перезаписи URL. Это проблема с HTTP POST:

когда IIS изначально выполняет кастом URL на 404 ошибки, он меняет POST на ПОЛУЧИТЬ, даже если клиент делает POST запрос.

(благодаря блогу elite brains о настройке IIS6 и ASP.NET MVC ).

Вместо того, чтобы создавать свой собственный HttpModule, я решил вместо этого использовать Ionics Isapi Rewrite Filter , чтобы переписать мои URL. Затем я устанавливаю обработчик ошибок 404 в IIS по умолчанию. И я создал этот файл IIRF.ini, чтобы перенаправить все запросы в тот же формат, что и обработчик 404:

RewriteCond %{REQUEST_FILENAME}  !-d
RewriteCond %{REQUEST_FILENAME}  !-f
RewriteRule ^(.*)$               /Default.aspx?404;http://%{HTTP_HOST}$1  [U,L]

И все, кажется, работает отлично. Преимущество перед в моем предыдущем ответе заключается в том, что код перезаписи является низкоуровневым и работает быстро, а переключатели -f и -d означают, что если файл действительно существует, он не перезаписывается, поэтому статические файлы не работает через .net.

0 голосов
/ 18 декабря 2009

Проблема в том, что тег <form> страницы ссылается на "уродливый" URL-адрес в качестве действия. Вы можете решить это, полностью удалив тег действия из формы. По умолчанию браузеры отправляют сообщения на ту же страницу, т.е. "красивый" URL.

В этой статье объясняется, как создать форму без действия (~ две трети пути вниз) http://msdn.microsoft.com/en-us/library/ms972974.aspx

...