канал запросов WCF; Что происходит на самом деле?

Что на самом деле происходит, когда человек вызывает метод Open для IRequestChannel? Например, если у меня есть следующий код:

ChannelFactory<IRequestChannel> factory = new ChannelFactory<IRequestChannel>();
// using a netTcpBinding to a net.tcp://localhost:9999/Bar
IRequestChannel outchannel = factory.CreateChannel();
outchannel.Open(); // what happens here?
if (outchannel.State == CommunicationState.Opened)
{
    success = true;
}
outchannel.Close();

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

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


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

<binding name="secureNetTcpStream" maxBufferSize="2000000" maxReceivedMessageSize="2000000000" transferMode="Streamed" sendTimeout="00:05:00" receiveTimeout="14:00:00">
    <readerQuotas maxStringContentLength="2000000000" maxArrayLength="2000000000" />
    <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" />
    </security>
</binding>

Интересно, приводит ли конфигурация потокового поведения к тому, что IRequestChannel показывает, что он открыт, даже когда хост и служба недоступны?


person t3rse    schedule 26.12.2008    source источник


Ответы (1)


Вызов функции Open действительно свяжется со стороной сервера и откроет канал связи.

Однако могут быть ситуации, когда Open завершится успешно, но вызов одного из методов службы завершится ошибкой.

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

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

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

person Yuval Peled    schedule 26.12.2008