asp.net gridview ссылки, кажется, "истекает" - как остановить? - PullRequest
0 голосов
/ 22 мая 2009

У меня есть страница ASP.NET 3.5 с привязкой gridview к общему списку объектов. Цель этой страницы - показать пользователю список элементов, за которые он отвечает, чтобы он мог выбрать один и перейти на страницу обслуживания, чтобы просмотреть подробную информацию об этом элементе.

У меня для свойства AutoGenerateSelectButton установлено значение True. У меня нет проблем, когда пользователь сразу выбирает один из элементов (запуская событие .SelectedIndexchanged, я выполняю небольшую обработку и Response.Redirect их на соответствующей странице).

Однако, если я подожду несколько минут, а затем нажму «Выбрать», я получу Невозможно отобразить веб-страницу , как если бы я был отключен от сети. В файл журнала приложения не отправляются сообщения (сообщения отладки, которые должны указывать, что пользователь выбрал конкретный элемент и что редирект должен произойти), поэтому мне нечего ловить / отлаживать / исправлять.

Я попытался зайти в web.config и добавил

"<sessionState timeout="60"></sessionState>" 

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

Где еще я могу посмотреть?

Ответы [ 4 ]

0 голосов
/ 23 мая 2009

Попробуйте установить EnableViewStateMac для фальсификации страницы , чтобы посмотреть, связано ли это с этим.

0 голосов
/ 22 мая 2009

Я могу видеть из вашего извлечения web.config, что вы выполняете свой sessionState в процессе (режим по умолчанию). В этом режиме состояние сеанса эффективно сохраняется в памяти в процессе рабочего процесса IIS. Это означает, что, когда процесс IIS Worker, обрабатывающий ваше приложение, завершается, например, поскольку IIS перезапускает пул приложений, состояние сеанса стирается.

Можно попытаться увеличить время простоя для рабочего процесса (по умолчанию 20 минут) в конфигурации пула приложений.

Для IIS6

  1. В IIS Manager разверните локальный компьютер, разверните пулы приложений, щелкните правой кнопкой мыши пул приложений, и затем нажмите Свойства.
  2. На вкладке «Быстродействие» в разделе «Режим ожидания» тайм-аут, отмените выбор рабочего выключения процессы после простоя для проверки коробка. -ИЛИ-
  3. В поле минут введите число минут простоя (без обработки запросы), которые вы хотите пройти перед закрытием простоя работника процесс. Значение по умолчанию 20 минут
  4. Нажмите ОК.

Для IIS7

  1. Открыть inetmgr
  2. Развернуть соответствующий сервер
  3. Нажмите «Пулы приложений»
  4. Щелкните правой кнопкой мыши пул приложений, в котором запущено ваше приложение, и в контекстном меню выберите «Переработка»
  5. Снимите все флажки, нажмите «Далее» и нажмите «Готово»
  6. Щелкните правой кнопкой мыши пул приложений, в котором запущено ваше приложение, и в контекстном меню выберите «Расширенные настройки ...»
  7. В разделе "Модель процесса" установите для параметра "Время простоя (минуты)" большое значение
  8. Нажмите «ОК»

Однако было бы намного лучше вывести состояние сеанса из процесса для долго работающих приложений, таких как ваше. Это довольно простая процедура, которая избавит вас от головной боли, связанной с сеансом. Статья по http://msdn.microsoft.com/en-us/library/ms178586.aspx даст вам хороший обзор того, как этого добиться.

0 голосов
/ 22 мая 2009

Привет, Дэвид,

Подобные проблемы трудно решить, задавая вопросы в режиме онлайн, их необходимо изучить на месте, поэтому я не дам вам ответа, а лишь несколько советов:

  • Использует ли это приложение аутентификацию и авторизацию? если это так, файл cookie для аутентификации может истечь после того, как приложение будет оставаться неактивным в течение длительного времени, и если вы нажмете кнопку «выбрать», вы будете перенаправлены на страницу входа, но сама страница входа может иметь проблему, которая вызывает Происходит цикл перенаправления, который заставляет большинство браузеров отображать сообщение «Эта страница не может быть отображена» после нескольких запусков цикла. Цикл может быть вызван другими факторами, поэтому я предлагаю отслеживать вашу интерактивность http, используя Fiddler , вы будете знать, какой ответ дает сервер, и почему браузер отображает страницу с ошибкой.
  • При подключенном fiddler я предлагаю запустить приложение в режиме отладки, и в меню Visual Studio выберите «Отладка»> «Исключения», а затем установите все флажки в столбцах «Брошенный» и «Необработанный пользователь», это приведет к отладчику. нарушать каждое исключение, даже если оно обработано.
  • Последний пункт не имеет значения: я предлагаю изменить способ, которым пользователи выбирают из сетки. вместо кнопки «выбрать» ссылку, поместите ссылку с URL-адресом другой страницы и передайте идентификатор выбранного элемента в качестве параметра URL-адреса. Это сэкономит двустороннюю передачу на сервер и крошечные издержки хранения сеанса. На другой странице вы должны позаботиться о том, чтобы кто-то не играл с параметром url для манипулирования данными, на которые у него нет разрешений.
0 голосов
/ 22 мая 2009

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

При загрузке страницы добавьте столбец в сетку.

 If Not IsPostBack Then
        Dim field As New TemplateField
        field.HeaderText = "Maintenance"
        Dim col As DataControlField = field
        GridView.Columns.Add(col)

- Добавить здесь кнопку ссылки

For i = 0 To GridView.Rows.Count - 1
            Dim alinkbutton As New Linkbutton
            GridViewCshr.Rows(i).Cells(3).Controls.Add(alinkbutton )
        Next
 End If

(добавление кнопки в сетку находится в третьем столбце, но добавляйте ее там, где вы добавляете новый столбец программным способом)

--- Затем в GridView_rowcommand

Response.Redirect("url")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...