Перезапустите службу WCF, размещенную в консольном приложении C # - PullRequest
4 голосов
/ 05 марта 2011

У меня есть служба WCF, которая размещена в консольном приложении c #. Есть ли способ перезапустить эту службу, предпочтительно путем вызова конечной точки в самой службе (например, myService.Restart ()).

Спасибо

Ответы [ 5 ]

1 голос
/ 10 марта 2011

Чтобы ответить на мой вопрос, я решил проблему, выполнив следующее:

  • Разделение кода, который загружает файлы DLL из служебного кода WCF, в другой проект библиотеки классов
  • Создание интерфейса с теми же сигнатурами методов, что и для тех, которые загружают файлы DLL в новом проекте (этот интерфейс сейчас используется обоими проектами)
  • В веб-службе загрузите другой проект в новом домене приложения. Таким образом, файлы DLL блокируются новым доменом приложения, а не по умолчанию.

Если я хочу обновить свои файлы DLL библиотеки nunit, все, что мне нужно сделать, это выгрузить домен приложения из веб-службы, обновить файлы и, наконец, создать новый домен приложения.

AppDomain remoteDomain = AppDomain.CreateDomain("New Domain");
IClass1 class1 = (IClass1)remoteDomain.CreateInstanceFromAndUnwrap(
                           "Test1.dll", "Test1.Class1");

Примечание: IClass1 - это общий интерфейс между проектами.

1 голос
/ 05 марта 2011

Мне нужно сделать нечто подобное, когда я выполняю автоматическое обновление удаленной службы WCF.В вашем методе Restart () закройте хост:

    try
    {
        host.Description.Endpoints.Where(x => !x.Address.ToString().EndsWith("MEX")).ForEach(endpoint => _log.InfoFormat("Closing {0}", endpoint.Address));
        host.Close(TimeSpan.FromSeconds(5));
    }
    catch (Exception)
    {
        host.Abort();
    }

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

Если вы просто хотите немедленно перезагрузить компьютер, вы можете просто вызвать host.Open (), или вы можете настроить таймер для его вызова и т. д.

try
{
    host.Open();
    host.Description.Endpoints.Where(x => !x.Address.ToString().EndsWith("MEX")).ForEach(endpoint => _log.InfoFormat("Host opened at: {0}", endpoint.Address));
}
catch (Exception ex)
{
    _log.Error("Unable to open host.", ex);
}
0 голосов
/ 05 марта 2011

Вы не можете попросить службу перезапустить себя. Рассмотрим службу Windows (службу, размещенную в контейнере, предоставленном Windows), которая имеет функцию RESTART. Здесь функциональность RESTART обеспечивается не службой, а контейнером. Контейнер определяет, как остановить службу и запустить ее.

Аналогично, в вашем случае вы должны попытаться найти варианты, если ваш контейнер может предоставить вам необходимые функции. Поскольку вы хотите управлять им удаленно, контейнер также должен быть доступен удаленно, что невозможно, если контейнер представляет собой консольное приложение. Вместо этого это должен быть другой веб-сервис или веб-приложение.

0 голосов
/ 05 марта 2011

Это немного глупо, но я полагаю, что вы могли бы предоставить обратный вызов в вашем сервисе, к которому хост мог бы подключиться, и предпринять соответствующие действия при его запуске. Это дало бы вашему хосту возможность решить, что на самом деле означает «перезапуск» и как его выполнять. Что еще более важно, он позволяет вам решить, следует ли ему делать что-то экстремальное, например, порождать процесс наблюдателя, а затем отключать сам себя или грациозно отбрасывать и восстанавливать ваш сервис (предпочтительно).

Мммммм ... Клудж ....

0 голосов
/ 05 марта 2011

вы определенно не сможете «перезапустить» неисправный сервис, вызвав сам этот сервис. Теоретически вы можете разместить 2 сервиса в одном и том же процессе. поместите тот, который вы хотите перезапустить, в публичную статическую переменную и перезапустите его в другом сервисе. Проблема будет в перезапуске службы перезапуска, если она выйдет из строя ... :), и вы определенно хотите иметь «администраторские» ограничения на службу перезапуска, чтобы неавторизованные пользователи не могли этого сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...