Поиск времени, необходимого для отправки сообщений с помощью WCF net.tcp - PullRequest
2 голосов
/ 02 октября 2008

Я пишу прототип распределенного приложения с поддержкой WCF, чтобы попытаться выяснить любые проблемы, которые у меня возникнут при обновлении моего существующего приложения «отправка xml через tcp для связи», которое я получил. Я использую Callback Contracts для регистрации клиентов на сервере (Singleton в ServiceHost), и пока все коммуникации между клиентом и сервером работают. Я могу подключить к серверу несколько клиентов и отправить с сервера широковещательную рассылку, полученную всеми клиентами. Я могу заблокировать определенного клиента, и другие клиенты все еще получают вызовы. Это хорошо.

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

Есть ли что-то похожее на расширения SOAP, где я могу добавить исходящие с сервера и входящие на клиент? Или мне нужно было бы добавить параметр «timeSent» для каждого метода, который сервер вызывает на клиенте, и записывать время, полученное на клиенте (чёрт!)? Есть ли лучший способ сделать это?

Я использую net.tcp, а не wsDualHttpBinding (который также работает, но менее производительно).

Ответы [ 2 ]

2 голосов
/ 02 октября 2008

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

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

1 голос
/ 02 октября 2008

Дэвид прав насчет проблем с синхронизацией часов. Тем не менее, добавление информации о метках времени вне реализации службы / клиента совсем не сложно в WCF.

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

На самом деле существует два интерфейса инспектора сообщений: один для клиента ( IClientMessageInspector ) и один для сервера ( IDispatchMessageInspector ).

Самый простой способ подключить инспектор диспетчеризации на стороне службы - это поведение службы (IServiceBehavior), поскольку вы можете подключить его к реализации службы в качестве настраиваемого атрибута. Вот простой пример 1011 * того, как это сделать. Вы также можете подключить его через IEndpointBehavior, но вам нужно сделать это либо с помощью кода при настройке хоста службы, либо с помощью конфигурации, которая требует написания немного больше кода.

На стороне клиента вы все еще используете поведение конечных точек, но вводить их с помощью кода намного проще, поскольку у вас есть прямой доступ к ClientRuntime из прокси-клиента.

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

...