Как определить, находится ли текущий пул приложений в IIS7.5 и Asp.Net 3.5+ - PullRequest
17 голосов
/ 10 августа 2010

Что ж, именно так, как заявляет субъект вопроса, есть какие-нибудь идеи о том, как вы можете это сделать?

Я просматривал объекты в System.Web.Hosting, но ничего не выделялось.

причина?Я получаю одну или две ошибки приложения, которые обычно происходят во время перезапуска (они происходят с интервалом около 25 часов, и я оставил время перезапуска пула приложений по умолчанию), и поэтому я хочу знать, происходят ли они впоток, который находится в пуле, который закрывается, или тот, который запускается (ed / ing) вверх.

Ответы [ 4 ]

18 голосов
/ 18 августа 2010

Я недавно наткнулся на эту статью о Brain.Save () , в которой рассказывается именно об этой проблеме с точки зрения хостинга WCF (он Стив Мейн - руководитель программы в Редмонде в отделе подключенных служб) ).

Они должны быть в состоянии сделать это, когда служба WCF размещена в Asp.Net, поскольку они должны иметь возможность отключить любые открытые прослушиватели, чтобы механизм WCF в новом домене приложения мог открыть их все. еще раз.

Как показано в статье, ответ заключается в реализации интерфейса IRegisteredObject , вызовите ApplicationManager.CreateObject, чтобы создать экземпляр вашего объекта, а затем зарегистрируйте его с помощью HostingEnvironment.RegisterObject (все подробно описано в документации MSDN для интерфейс).

Когда реализация IRegisteredObject.Stop(bool) этого объекта вызывается с false в качестве параметра, это уведомление о том, что домен приложения закрывается и что объект должен быть незарегистрированным (вроде глобального удаления) с вызовом HostingEnvironment.UnregisterObject.

Когда он вызывается с помощью true, это означает, что вы не зарегистрировались вовремя, и что если вы не отмените регистрацию немедленно, это будет сделано для вас.

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

Тем не менее, я вполне могу начать смотреть на этот механизм персистентности для некоторых других моих более сложных статических данных!

История

В статье также объясняется история и обоснование того, почему вы бы хотели использовать IRegisteredObject вместо Application_Start и Application_End в global.asax:

Традиционные приложения ASP.NET могут перехватывать события жизненного цикла приложения (запуск / выключение приложения) путем реализации таких методов, как Application_Start и Application_Stop в global.asax. Однако global.asax предназначен для кода приложения. Элементам инфраструктуры (одной из которых является хост-система WCF) необходим механизм перехвата событий жизненного цикла AppDomain, которые не включают в себя сброс кода инфраструктуры в ваш файл global.asax. Это пространство зарезервировано для вас, пользователя, и было бы неприлично использовать это, чтобы загрязнить то, что с кучей хостинг-сума мы должны заставить все это работать. Вместо этого ребята из ASP.NET проделали отличную работу во время выпуска Whidbey, чтобы открыть API-интерфейсы хостинга и упростить для таких людей, как WCF, присоединение и перехватывание этих событий жизненного цикла таким образом, чтобы это было невидимо для кода приложения.

8 голосов
/ 14 декабря 2012

Вы можете проверить значение System.Web.Hosting.HostingEnvironment.ShutdownReason , когда пул приложений не находится в процессе закрытия / переработки, он будет иметь ShutdownReason изНикто.

4 голосов
/ 20 февраля 2017

Добавление фактического кода для этого:

public class RecycleWatcher : IRegisteredObject
{
    public static bool IsRecycling { get; private set; }

    public void Register()
    {
        HostingEnvironment.RegisterObject(this);
    }
    public void Stop(bool immediate)
    {
        IsRecycling = true;
    }
}

Затем включите его, запустив

new RecycleWatcher().Register();

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

if (RecycleWatcher.IsRecycling) DoSomething();
1 голос
/ 10 августа 2010

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

 protected void Application_End(object sender, EventArgs e)
 {
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...