ASP.NET MVC: странное поведение POST - PullRequest
5 голосов
/ 26 января 2010

ASP.NET MVC 2 приложение

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

  1. [GET] Список
  2. [POST] Добавить

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

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

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

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

У меня хостинг на webhost4life.com, и они уже переключили IIS7 на интегрированный режим.

РЕДАКТИРОВАТЬ: Код работает должным образом с использованием сервера UltiDev Cassini.

РЕДАКТИРОВАТЬ: Оказалось, что проблема с косой чертой в URL. Каким-то образом IIS7 не направляет запрос должным образом, если в конце нет косой черты.

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

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

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

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

Q: как лучше справиться с этим?

1 Ответ

1 голос
/ 09 июля 2010

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

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

...