Подтвердить что ты не робот

Существует ли возможное "состояние гонки" при использовании Asp.Net MVC TempData через перенаправление?

При использовании TempData я понимаю, что он сохранит все, что вы вложите в него только для одного запроса. Поэтому при использовании TempData для хранения данных через перенаправление (для использования шаблона Post-Request-Get) невозможно ли, чтобы какой-либо другой запрос от пользователя мог прийти на сервер между ответом, отправляющим перенаправление, и браузер пользователя, запрашивающий перенаправленную страницу? В этом случае у получателя больше нет доступных TempData, правильно?

Теперь я понимаю, что что-то подобное происходит очень редко, но принимая во внимание, что пользователь может открыть другую страницу на другой вкладке, и на этой странице могут быть либо ajax, либо timed запросы обратного вызова, это внезапно не кажется мне настолько невозможным. Как правило, считается, что он слишком удален, чтобы беспокоиться, или я что-то не понимаю?

Изменить: более подробно о сценарии, о котором я спрашивал.

  • В закладке 1 пользователь просматривает страницу с формой сообщения
  • В закладке 2 пользователь просматривает другую страницу на сайте, которая делает ajax обратные вызовы по таймеру
  • В закладке 1 пользователь отправляет форму на сервер
  • Когда сервер получает сообщение, он сохраняет некоторые данные в TempData и отправляет ответ на перенаправление
  • На вкладке 2 выполняется временный обратный вызов ajax, отправляющий на сервер запрос GET. TempData удаляется из сеанса
  • В закладке 1 браузер получает перенаправление и выдает запрос GET
  • Сервер обрабатывает запрос GET и ищет TempData, но он больше не существует
4b9b3361

Ответ 1

Хорошо, просмотр кода ASP.NET MVC показывает, что в то время как TempData хранится в сеансе, он удаляется из сеанса при его загрузке. И он загружается в метод Controller ExecuteCore().

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

Учитывая, что ASP.NET MVC-сайт может быть сервисом для любого браузера (он в Интернете, после всего:)), это реальный сценарий, хотя, вероятно, и редкий, как вы сказали.

Ответ 2

При использовании TempData вполне возможно иметь условие гонки. Тем не менее, вы должны, конечно, быть "неудачливыми", чтобы испытать это при нормальном использовании. Для того, чтобы попасть в состояние гонки, все должно быть правдой:

  • Вы должны использовать TempData для начала.
  • Вам нужно открыть несколько окон браузера/вкладки/whatevers и использовать один и тот же сеанс браузера.
  • Запрос со второй вкладки браузера должен "прокрасться" между запросом и ответом первой вкладки браузера.

Обратите внимание, что элемент №2 зависит от того, какой браузер вы используете. В зависимости от того, как вы настроили IE, просто потому, что вы открываете несколько окон, это не означает, что они совместно используют куки файлы браузера, и поэтому они не обязательно используют сеансы (основанные на куки файлах).

Однако, нет никакого условия гонки в том смысле, что что-то взрывается, если вы столкнетесь с ним. Это может быть то, на что ссылается Хаакед. Но вы можете попасть в состояние гонки в том смысле, что вы задали несколько TempData в одном запросе, а затем не получили его обратно в следующем запросе, где, по вашему мнению, вы его получите. Он просто будет пустым.

Спасибо, Eilon

Ответ 3

В TempData используется объект Session, который не страдает этой проблемой, AFAIK. Вы столкнулись с конкретной проблемой?

Ответ 4

Я думаю, что это никогда не произойдет, хотя в начале у меня такое же замешательство. Подумайте об этом, если вы запустите свое веб-приложение mvc в режиме отладки, тогда вы установите точку останова в действии перенаправления. И вы даете tempdata a значение, то вы получите tempdate в redirect viewResult и в другом представлении, вы обнаружите, что другой запрос никогда не будет отвечать до тех пор, пока действие перенаправления не будет завершено. Что это значит? Он сказал, что приложение mvc запускается в режиме одиночного потока, оно может обрабатывать один запрос за один раз. Так что описанный выше сценарий никогда не может произойти.