ASP.NET MVC - TempData - Хорошая или плохая практика

Неустранимая ошибка: допустимый размер памяти из XXX байт исчерпан (пытался выделить XXX байты)

Недостаточно памяти для запуска вашего скрипта. PHP достиг предела памяти и перестает его выполнять. Эта ошибка является фатальной, сценарий останавливается. Значение предела памяти можно настроить либо в файле php.ini, либо с помощью ini_set('memory_limit', '128 M'); в скрипте (который перезапишет значение, определенное в php.ini). Цель ограничения памяти заключается в том, чтобы не допустить, чтобы один скрипт PHP собирал всю доступную память и приводил к остановке всего веб-сервера.

Первое, что нужно сделать, это свести к минимуму объем памяти, необходимый вашему сценарию , Например, если вы читаете большой файл в переменной или извлекаете много записей из базы данных и сохраняете их все в массиве, которые могут использовать много памяти. Измените свой код, чтобы вместо этого читать строки по строке или извлекать записи базы данных по одному, не сохраняя их все в памяти. Это требует немного концептуального понимания того, что происходит за кулисами, и когда данные хранятся в памяти и в других местах.

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

Вопросы, относящиеся:

95
задан Rudi Visser 21 February 2013 в 11:01
поделиться

6 ответов

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

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

25
ответ дан Frank Schwieterman 24 November 2019 в 05:52
поделиться

Никакая потребность испытать неприязнь к TempData... Но если не используемый правильно это мог бы, конечно, быть признак плохого дизайна. При использовании УСПОКОИТЕЛЬНОГО URL TempData является лучшей практикой для передачи сообщений от Действий POST до Вашего ПОЛУЧАТЬ Действия. Рассмотрите это:

у Вас есть форма в продуктах URL / Новый. Сообщения формы к продуктам/Создавать, который проверяет форму и создает продукт На Успехе перенаправления Контроллера к продуктам/1 URL и на ошибке, перенаправили бы назад к продуктам / Новый для отображения сообщений об ошибках.

продуктами/1 является просто стандарт, ПОЛУЧАЮТ действие для продукта, но мы хотели бы, чтобы сообщение отобразило указание, что вставка имела успех. TempData идеально подходит для этого. Добавьте сообщение к TempData в Контроллере Сообщения и поместите некоторых если логика в представлении и Вашем сделанном.

При отказе я добавлял значения, вводимые в formCollection и набор сообщений об ошибках к TempData в Действии Сообщения, и перенаправлял к начальному Действию Prodcuts/New. Я добавил логику к представлению для заполнения исходных данных формы с ранее вводимыми значениями наряду с любыми сообщениями об ошибках. Кажется хорошим и чистым мне!

76
ответ дан JasonD 24 November 2019 в 05:52
поделиться

Я думаю, что Вы преуспеваете для колебания перед использованием TempData. TempData хранится на сессии, и это может иметь последствия для Вас если:

  1. Вы не используете сессии на своем сайте прямо сейчас
  2. , у Вас есть система, которая должна масштабироваться к высокой пропускной способности, т.е. Вы предпочли бы избегать состояния сеанса в целом
  3. , Вы не хотите использовать cookie (я не знаю, как хорошо MVC поддерживает cookieless сессии прямо сейчас)

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

31
ответ дан John Rayner 24 November 2019 в 05:52
поделиться

У меня есть метод GetModel, который сначала проверяет на TempData ["модель"] и возвраты это. Иначе GetModel загружает соответствующие данные из базы данных.

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

3
ответ дан Todd Smith 24 November 2019 в 05:52
поделиться

Почему у Вас есть такое отвращение? Эта вещь, просто делают ее задание и делают его хорошо:)

, Если Вам не нравится он из-за него несо строгим контролем типов, можно всегда делать обертку, вокруг которой предоставит Вам интерфейс со строгим контролем типов.

2
ответ дан maxnk 24 November 2019 в 05:52
поделиться

Это похоже на использование ViewData, означая, что это - вероятно, не угроза безопасности. Но я использовал бы ViewData, чем TempData. Проверьте здесь на сравнение: http://www.squaredroot.com/2007/12/20/mvc-viewdata-vs-tempdata/

В зависимости от дизайна, Вы могли всегда хранить пользователя / корзина или независимо от того, что Вы нуждаетесь в tempdata в базе данных и просто имеете поле "IsReady", которое указывает, если его завершенный или нет, делая его расширяемым на потом, если Вы хотите взять в памяти, что люди могут закрыть свои браузеры.

2
ответ дан Magnus Johansson 24 November 2019 в 05:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: