Существует ли возможное «состояние гонки» при использовании Asp.Net MVC TempData через перенаправление?
-
04-07-2019 - |
Вопрос
Насколько я понимаю, при использовании TempData все, что вы в него поместите, будет храниться только для одного запроса.Итак, при использовании TempData для сохранения данных при перенаправлении (чтобы использовать шаблон Post-Request-Get), разве не может быть, что какой-то другой запрос от пользователя может поступить на сервер между ответом, отправляющим перенаправление, и Браузер пользователя запрашивает перенаправленную страницу?В каком случае у get больше не будет доступных TempData, верно?
Теперь я понимаю, что что-то подобное происходит очень редко, но, принимая во внимание, что у пользователя может быть открыта другая страница на другой вкладке, и на этой странице могут происходить либо ajax-запросы, либо запросы обратного вызова по времени, это внезапно не происходит. мне кажется все это невозможным.Просто обычно это считается слишком отдаленным, чтобы о нем беспокоиться, или я что-то не понимаю?
Редактировать:Чтобы быть более конкретным о сценарии, о котором я спрашивал.
- На вкладке 1 пользователь просматривает страницу с формой поста
- На вкладке 2 пользовательские браузеры на другую страницу на сайте, которая выполняет обратные вызовы Ajax на таймере
- На вкладке 1 пользователь отправляет форму на сервер.
- Когда сервер получает сообщение, он сохраняет некоторые данные в TempData и отправляет обратно ответ перенаправления
- На вкладке 2 происходит обратный вызов ajax по времени, отправляющий запрос GET на сервер.TempData удаляется из сеанса
- На вкладке 1 браузер получает перенаправление и отправляет запрос GET.
- Сервер обрабатывает запрос GET и ищет TempData, но его больше нет.
Решение
Что ж, просмотр кода ASP.NET MVC показывает, что, хотя TempData хранится в сеансе, он удаляется из сеанса при загрузке. И он загружается в метод ControlteCore () контроллера.
Я думаю, это будет означать, что да, вы вполне можете столкнуться с состоянием гонки, когда запрос с другой вкладки браузера (у вас был довольно хороший пример) может вызвать эту проблему. Но это будет зависеть от модели каждого браузера для обработки запросов. Браузер может сериализовать все запросы к одному и тому же серверу, чтобы одновременно выполнялся только один запрос. В действительности, они не будут этого делать, однако, они ограничат максимальный уровень, который составляет (я думаю) 5 одновременных запросов к одному и тому же серверу.
Учитывая, что сайт ASP.NET MVC может быть запросом на обслуживание любого браузера (это, в общем-то, Интернет), это реальный сценарий, хотя, как вы сказали, и редкий,
Другие советы
При использовании TempData вполне возможно возникновение состояния гонки.Однако вам, конечно, придется «не повезти», чтобы испытать это при обычном использовании.Чтобы попасть в состояние гонки, все следующие условия должны быть истинными:
- Для начала вам нужно использовать TempData.
- У вас должно быть открыто несколько окон/вкладок/что-то еще в браузере и использовать один и тот же сеанс браузера.
- Запрос со второй вкладки браузера должен «проскользнуть» между запросом и ответом первой вкладки браузера.
Обратите внимание, что пункт №2 во многом зависит от того, какой браузер вы используете.В зависимости от того, как вы настроили IE, то, что у вас открыто несколько окон, не означает, что они используют файлы cookie браузера, и, следовательно, они не обязательно используют общие сеансы (которые основаны на файлах cookie).
Однако не существует состояния гонки в том смысле, что что-то взрывается, если вы с этим столкнетесь.Возможно, именно это имеет в виду Хаакед.Но ты может попадание в состояние гонки в том смысле, что вы устанавливаете некоторые TempData в одном запросе, а затем не получаете их обратно в следующем запросе, где вы мысль ты собирался это получить.Там будет просто пусто.
Спасибо, Эйлон
TempData использует объект Session, который не страдает от этой проблемы, AFAIK. Вы столкнулись с определенной проблемой с этим?
Я думаю, что этого никогда не произойдет, хотя вначале у меня возникла такая же путаница. Подумайте об этом, если вы запускаете ваше веб-приложение mvc в режиме отладки, тогда вы устанавливаете точку останова в действии перенаправления. И вы даете временным данным значение, то вы получите tempdate в redirect viewResult и в другом представлении вы обнаружите, что другой запрос никогда не будет получен до тех пор, пока не будет выполнено действие redirect. Так что это значит? Он сказал, что приложение mvc работает в однопоточном режиме, оно может обработать один запрос за один раз. Так что вышеупомянутый сценарий никогда не может произойти.