Как проверить доступность сервиса net.tcp WCF

Мой сервер WCF должен регулярно подниматься и опускаться, клиент иногда использует сервер, но если он не работает, клиент просто игнорирует его. Поэтому каждый раз, когда мне нужно использовать серверные службы, я проверяю состояние подключения, и если он не открывается, я его открываю. Проблема в том, что если я пытаюсь открыть, пока сервер не работает, есть задержка, которая влияет на производительность. Мой вопрос: есть ли способ сделать что-то вроде myClient.CanOpen()? поэтому я бы знал, есть ли какая-нибудь точка, чтобы открыть соединение с сервером.

Ответы

Ответ 1

Существует реализация WS-Discovery, которая позволит вам прослушивать сообщения вверх/вниз для вашей службы. Это также очень удобная форма разрешения адресной службы, поскольку она использует многоадресные сообщения UDP для поиска службы, а не для настройки одного заданного адреса на клиенте. WS-Discovery для WCF

Там также реализована работа сотрудника Microsoft: Пример внедрения WS-Discovery

.NET 4.0 будет включать это изначально. Вы можете прочитать о внедрении .NET 4.0 в блоге Иисуса Родригеса. Он имеет большую диаграмму, в которой подробно описывается специальная связь, которая продолжается в WS-Disco Использование WS-Discovery в WCF 4.0

Еще одна вещь, которую вы могли бы подумать, особенно если ваши сообщения в основном односторонние, - это протокол, который работает изначально отключен, например, MSMQ. Я не знаю, как выглядит ваш дизайн для вашего приложения, но MSMQ разрешает клиенту отправлять сообщение независимо от состояния службы, и служба получит его, когда он вернется. Таким образом, ваш клиент не должен блокировать достаточно много, пытаясь получить подтверждение того, что служба до того, как обмениваться информацией... он просто запустит и забудет.

Надеюсь, что это поможет.

Ответ 2

Если вы выполняете синхронный вызов, ожидая тайм-аута сервера в приложении с пользовательским интерфейсом, вы должны делать это в другом потоке. Я сомневаюсь, что поражение производительности связано с накладными расходами на исключение. Является ли ваш штраф за производительность при загрузке процессора, доступности GUI или настенных часов?

Вы можете исследовать, можете ли вы создать настраиваемую привязку в TCP, но с более быстрым временем ожидания.

Я предполагаю, что вы знаете, что "IsOneWay = true" быстрее, чем запрос- > ответ в вашем случае, потому что вы не ожидаете ответа в любом случае, но тогда вы не получите подтверждение или возвращаете значения. Вы также можете реализовать двустороннюю связь, которая не является request- > response.

Ответ 3

Я не думаю, что это возможно сделать вызов на стороне сервера вашему Клиенту, чтобы сообщить ему, что вы запустили службу... Лучший метод, который я вижу, - это метод клиента, определяющий, где или нет служба открыта и в хорошем состоянии. Если у меня не хватает некоторых функций WCF...

Существует хороший блог-блог WCF: доступность служб WCF, если вы заинтересованы в чтении.

Ответ 4

Если бы вы были в локальной сети, возможно было бы транслировать сигнал, чтобы сказать, что новый сервер работает. Клиент должен будет прослушивать широковещательный сигнал и отвечать соответствующим образом.

Ответ 5

Вот что я использую, и это работает как шарм. И кстати, класс ServiceController живет в пространстве имен "System.ServiceProcess".

try
{
    ServiceController sc = new ServiceController("Service Name", "Computer IP Address");
    Console.WriteLine("The service status is currently set to {0}",
        sc.Status.ToString());

    if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) ||
        (sc.Status.Equals(ServiceControllerStatus.StopPending)))
    {
        Console.WriteLine("Service is Stopped, Ending the application...");
        Console.Read();
        EndApplication();
    }
    else
    {
        Console.WriteLine("Service is Started...");
    }
}
catch (Exception)
{
    Console.WriteLine("Error Occurred trying to access the Server service...");
    Console.Read();
    EndApplication();
}