Я довольно долго искал ответы на этот вопрос, поскольку он продолжает мучить меня.Мы храним данные для входа в систему и другие данные о текущих действиях пользователя в Session State (InProc).Время от времени я получаю исключение Null Reference, пытающееся использовать одну из переменных сеанса.Это происходит на случайных страницах со случайными переменными сеанса.Я изменил теги web.config httpRuntime и compation, чтобы предотвратить перезапуск appPool:
<httpRuntime requestValidationMode="2.0" waitChangeNotification="86400" maxWaitChangeNotification="86400" />
<compilation debug="False" strict="false" explicit="true" targetFramework="4.0" numRecompilesBeforeAppRestart="1000" />
Я настроил IIS для перезапуска пула приложений в 3 часа ночи, чтобы он не перезапускался, когда люди заняты использованием сервера.И я регистрирую перезапуски пула приложений в журнале событий, чтобы убедиться, что я знаю, когда это происходит.
Dim runtime As HttpRuntime = GetType(System.Web.HttpRuntime).InvokeMember("_theRuntime", BindingFlags.NonPublic Or BindingFlags.Static Or BindingFlags.GetField, Nothing, Nothing, Nothing)
Dim shutDownMessage As String = runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, runtime, Nothing)
Dim shutDownStack As String = runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, runtime, Nothing)
Dim evtSource As String = "ASP.NET"
Dim log As New EventLog
log.Source = evtSource
log.WriteEntry(String.Format("_shutDownMessage={0}{2}_shutDownStack={1}", shutDownMessage, shutDownStack, vbCrLf & vbCrLf), EventLogEntryType.Warning)
Я получаю записи журнала событий при перезапуске пула приложений.Пул приложений НЕ перезапускается при возникновении этих ошибок.
Когда определенные переменные сеанса теряются, большинство других переменных сеанса для того же пользователя остаются на месте.Кроме того, как правило, на сайт заходит еще 10-20 пользователей, на которых это не влияет.
Пользователь, получивший ошибку, создаст резервную копию, снова пройдет по тем же страницам и будет работать нормально.
У меня была эта проблема на Windows Server 2003 (32-разрядной), работающей под управлением IIS6 с 32-разрядной .NET 3.5 и 4 ГБ памяти. В рамках обновления нашего сервера около года назад мы получили новый веб-сервер - Windows Server 2008 (64-разрядная)) работает IIS 7 с 16 ГБ памяти.Я обновил сайт до .NET 4.0 64bit.Все еще возникают те же проблемы на новой машине (обычно 1-3 раза в день - в случайное время в течение дня).
Я не могу сделать это в своей отладке из-за ее случайного характера, но я верю,это происходит случайным образом в нашей среде разработки.Сервер разработчика имеет практически те же характеристики, что и рабочий.
Обе среды изолированы и работают как один веб-сервер, а не как часть веб-фермы.
Я думаю, что я могу попробоватьреализовать State Server для выхода из режима InProc, но это всего лишь еще один удар в темноте.
Кроме попыток использования State Server, могу ли я что-то еще сделать, чтобы определить, когда это произойдет или предотвратить это?