Как проверить доступность сервиса net.tcp WCF - PullRequest
15 голосов
/ 19 мая 2009

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

Ответы [ 5 ]

24 голосов
/ 19 мая 2009

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

Есть также реализация, сделанная сотрудником Microsoft: Пример реализации WS-Discovery

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

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

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

3 голосов
/ 19 мая 2009

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

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

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

1 голос
/ 12 марта 2014

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

try
{
    ServiceController sc = new ServiceController("Service Name", "Computer's 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();
}
1 голос
/ 19 мая 2009

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

1 голос
/ 19 мая 2009

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

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

...