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

StackOverflow https://stackoverflow.com/questions/235665

Вопрос

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

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

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

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

Решение

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

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

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

Другие советы

При использовании TempData вполне возможно возникновение состояния гонки.Однако вам, конечно, придется «не повезти», чтобы испытать это при обычном использовании.Чтобы попасть в состояние гонки, все следующие условия должны быть истинными:

  1. Для начала вам нужно использовать TempData.
  2. У вас должно быть открыто несколько окон/вкладок/что-то еще в браузере и использовать один и тот же сеанс браузера.
  3. Запрос со второй вкладки браузера должен «проскользнуть» между запросом и ответом первой вкладки браузера.

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

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

Спасибо, Эйлон

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top