Есть ли какие-нибудь интересные данные, которые я мог бы получить из параметров Application_End()?

В моем приложении ASP.NET, которое я развертываю в Windows Azure, я хочу регистрировать как можно больше полезных данных. Есть Application_End() метод:

protected void Application_End(object sender, EventArgs e)
{
}

который вызывается с sender равным System.Web.HttpApplicationFactory и e равным просто System.EventArgs. С такими параметрами все, что я могу сделать, это просто зарегистрировать их типы, что не очень полезно.

Могу ли я получить какие-либо полезные данные из этих параметров? Бывают ли случаи, когда Application_End() вызывается с параметрами других, более полезных, типов?


person sharptooth    schedule 25.01.2013    source источник
comment
Что вы подразумеваете под интересным? То, что может быть интересно вам, может быть не интересно мне. Так что, может быть, немного более конкретно об информации, которую вы ищете в этом событии? Помните, что при вызове этого события нет HttpContext, что сужает количество вещей, которые вы можете из него извлечь.   -  person Darin Dimitrov    schedule 25.01.2013
comment
Дарин Димитров: Понятия не имею, но, может быть, я смогу найти причину, по которой приложение завершает работу, или что-то еще, что помогло бы мне определить контекст звонка.   -  person sharptooth    schedule 25.01.2013
comment
Нет, вы не можете узнать, почему ваше приложение заканчивается. Возможные причины, по которым вам следует искать: 1. web.config файл изменен 2. global.asax файл изменен 3. некоторые файлы в папке bin изменены или новый файл был добавлен или удален 4. ваше приложение достигло пороговых значений ЦП/памяти, которые были определены администратором, и IIS решил переработать его, чтобы освободить потребляемые ресурсы.   -  person Darin Dimitrov    schedule 25.01.2013
comment
@Дарин Димитров: Оказывается, это возможно, см. мой ответ.   -  person sharptooth    schedule 14.02.2013


Ответы (1)


IIS, class HttpRuntime включены, исходники можно скачать. Тщательный анализ показывает, что действительно параметры события всегда одни и те же и не несут никакой полезной информации. Стек вызовов для события тоже бесполезен — он всегда

my Application_End(Object sender, EventArgs e)
at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
at System.Web.HttpApplication.InvokeMethodWithAssert(MethodInfo method, Int32 paramCount, Object eventSource, EventArgs eventArgs)
at System.Web.HttpApplication.ProcessSpecialRequest(HttpContext context, MethodInfo method, Int32 paramCount, Object eventSource, EventArgs eventArgs, HttpSessionState session)
at System.Web.HttpApplicationFactory.Dispose()
at System.Web.HttpRuntime.Dispose()
at System.Web.HttpRuntime.ReleaseResourcesAndUnloadAppDomain(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

но... Существует System.Web.Hosting.HostingEnvironment.ShutdownReason, который можно получить из Application_End() и который устанавливается HttpRuntime при запуске приложения.

Итак, «интересные данные» — это System.Web.Hosting.HostingEnvironment.ShutdownReason.

Также см. этот тесно связанный вопрос

person sharptooth    schedule 14.02.2013