Я недавно наткнулся на эту статью о 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, присоединение и перехватывание этих событий жизненного цикла таким образом, чтобы это было невидимо для кода приложения.