2010-01-26 3 views
5

ASP.NET MVC приложениеASP.NET MVC: странное поведение POST

У меня есть два действия на моем контроллере (Toons):

  1. [GET] Список
  2. [POST] Add

Приложение работает в режиме интеграции IIS7, поэтому/Toons/List отлично работает. Но когда я делаю POST (который перенаправляет/Toons/List внутри), он перенаправляет (с 302 перемещенными объектами) обратно в/Toons/Add.

Проблема уходит, если я использую .aspx hack (работает в классическом режиме IIS6/IIS7).

Но без .aspx - GET работает нормально, но POST перенаправляет меня на себя, но с GET.

Что мне не хватает?

Я хостинг с webhost4life.com, и они уже изменили IIS7 в интегрированный режим.

EDIT: Код работает как ожидается, используя сервер UltiDev Cassini.

EDIT: Оказалось, что проблема связана с чересстрочной косой чертой. Как-то IIS7 не направляет запрос должным образом, если в конце нет косой черты.

Edet: Объяснение поведения
Что происходит, когда я прошу (POST) /Toons/List (без пробелов), IIS не находит обработчик (у меня нет знаний, чтобы понять, как именно IIS делает URL -to-handler mapping) и перенаправляет запрос (используя код 302) на /Toons/List/ (обратите внимание на косую черту).

браузер, в соответствии со спецификацией HTTP, необходимо перенаправить запрос используя тот же метод (POST в данном случае), но вместо этого он обрабатывает 302, как будто это 303 и выдает GET запрос на новый URL.

Это неправильное, но известное поведение большинства браузеров.

Решение заключается в использовании .aspx-hack, чтобы сделать его однозначным для IIS, как сопоставить запросы обработчику ASP.NET или настроить IIS для обработки всего в виртуальном каталоге с помощью обработчика ASP.NET.

Вопрос: Что такое лучший способ справиться с этим?

+0

Каков код для вашего действия Add? –

+0

return RedirectToAction («Список», «Toons»); –

+0

Что произойдет, если вы возьмете [GET] из действия «Список»? – 37Stars

ответ

1

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

Это ожидаемое поведение, а не ваша работа по восстановлению всего, что может случиться. , но вы должны дать хорошие подсказки (например, сообщение об исключении, а не странную ошибку или перенаправление.)

+0

Да, я могу решить так. Я использую маршрутизацию ASP.NET MVC, я пытаюсь избежать взлома маршрутизации MVC, чтобы добавить конечную косую черту к URL-адресам. Использование UltiDev не делает это так, как это делает IIS 7 (т. Е. С UltiDev мой код работает отлично, как я этого хочу). –

Смежные вопросы