Ответ 1
Недавно я наткнулся на эту статью о Brain.Save(), в которой говорится именно об этой проблеме с точки зрения размещения WCF (он Стив Мейн - менеджер программ в Редмонде в подразделении подключенных сервисов).
Они должны иметь возможность сделать это, когда служба WCF размещается внутри Asp.Net, так как они должны иметь возможность выключать любые открытые слушатели, чтобы механизм WCF в новом домене приложения смог открыть их все еще раз.
Как показано в статье, ответ заключается в реализации интерфейса IRegisteredObject, вызывает ApplicationManager.CreateObject
, чтобы создать экземпляр вашего объекта, а затем зарегистрировать он с HostingEnvironment.RegisterObject
(все подробно описано в документации MSDN для интерфейса).
Когда этот объект IRegisteredObject.Stop(bool)
вызывается с параметром false
в качестве параметра, это уведомление о том, что домен приложения закрыт и что объект должен быть незарегистрирован (вроде как глобальный dispose) с вызовом HostingEnvironment.UnregisterObject
.
Когда он вызывается с помощью true
, это означает, что вы не были незарегистрированы своевременно, и если вы не отмените регистрацию сразу, это будет сделано для вас.
Я могу, конечно, использовать этот механизм, чтобы узнать, когда возникает исключение, если AppDomain убит или нет. Характер объекта, который вызывает исключение, означает, что если он не при выключении, он должен быть при первом запуске.
В равной степени, однако, я могу начать рассматривать этот механизм сохранения для некоторых других моих более сложных статических данных!
История
В статье также объясняется некоторая история и обоснование того, почему вы хотели бы использовать методы 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, и задействовать эти события жизненного цикла таким образом, который невидим для кода приложения.