2010-06-27 2 views
2

У меня есть следующий код:System.ServiceModel.ClientBase подключен к службе

public partial class MyServiceClient : System.ServiceModel.ClientBase<... 

if (m_MyClient == null) 
    m_MyClient = new MyServiceClient 
     ("BasicHttpBinding_IMyService", remoteAddress); 

WriteOutput("Successfully connected to service"); 

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

ответ

2

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

Вы также можете проверить .State свойства клиентского канала - в идеале, это должно быть Opened в этой точке:

Используйте это, если вы вытекающее из ClientBase<T>

m_MyClient.State == CommunicationState.Opened 

или это вы используя стандартный клиентский класс, сгенерированный функциональностью Add Service Reference в Visual Studio:

(m_MyClient as IClientChannel).State == CommunicationState.Opened 
+0

следующий код шахты: m_MyClient = новый MyServiceClient («BasicHttpBinding_IMyService», remoteAddress); никогда не вызывает исключения. Только когда я пытаюсь связаться с сервисом, я получаю исключение. Я хотел бы узнать сразу после этого кода, если мой клиент действительно подключен? – Tamer

+0

@Tamer: ** WHAT ** исключение вы получаете ??? В WCF вы на самом деле не «подключены» - у вас есть канал для отправки сообщений, но нет никакого реального соединения, как с ADO.NET или что-то в этом роде ... –

+0

Обновление: Следующий код: (m_MyClient как IClientChannel) .State == CommunicationState.Open сбоев. Правильная вещь: m_MyClient.State == CommunicationState.Open Теперь интересно то, что CommunicationState всегда создается. Его никогда не открывали, он всегда оставался Созданным. Он открывается только после того, как сообщение действительно произойдет. Как после того, как я позвоню: m_MyClient.GetComments(); , а затем я проверяю состояние, только тогда оно открыто. – Tamer

1

После осознания того, что я упомянул в моем выше комментарии, я понял, что ответ на мой вопрос был следующим:

В моей ServiceContract я добавил следующее:

[OperationContract] 
bool IsAlive(); 

Чья implentation просто выглядит следующим образом:

public bool IsAlive() 
{ 
    return true; 
} 

Затем изменил код следующим образом:

m_MyClient = new MyServiceClient("BasicHttpBinding_IMyService", remoteAddress); 

try 
{ 
    m_MyClient.IsAlive(); 
} 
catch (EndpointNotFoundException) 
{ 
    WriteOutput("Unable to connect to service"); 

    m_MyClient = null; 
} 

if (m_MyClient != null) 
    WriteOutput("Successfully connected to service"); 
+0

Это не по теме, но теперь мне нужно подождать около минуты до того, как будет запущено исключение, так как это все будет работать в локальной сети, как уменьшить этот период таймаута? Я попытался уменьшить получениеTimeout на моем клиенте, но это не сработало. – Tamer