Поиск времени, необходимого для отправки сообщений с помощью WCF net.tcp
Я пишу прототип распределенного приложения с поддержкой WCF, чтобы попытаться выяснить любые проблемы, которые у меня возникнут при обновлении моих существующих приложений "отправка xml через tcp для связи", которые у меня есть. Я использую Callback Contracts для регистрации клиентов на сервере (Singleton в ServiceHost) и до сих пор все коммуникации между клиентом и сервером работают. Я могу подключить несколько клиентов к серверу и отправить широковещательную рассылку с сервера, полученную всеми клиентами. Я могу заблокировать определенного клиента, и другие клиенты все еще получают вызовы. Это хорошо.
Чтобы продолжить изучение и оценку производительности, я бы хотел, чтобы клиент записал, в какое время сервер отправляет каждое сообщение, а также в какое время клиент получает это же сообщение. Как мне лучше поступить об этом?
Есть ли что-то похожее на расширения SOAP, где я могу добавить исходящие с сервера и входящие на клиент? Или мне нужно добавить параметр "timeSent" для каждого метода, который сервер вызывает на клиенте, и записывать время, полученное на клиенте (чёрт!)? Есть ли лучший способ сделать это?
Я использую net.tcp, а не wsDualHttpBinding (который также работает, но менее производительный).
2 ответа
Дэвид прав насчет проблем с синхронизацией часов. Тем не менее, добавление информации о временной метке за пределами реализации службы / клиента совсем не сложно в WCF.
Вы правы: он не поддерживает SoapExtensions, хотя, на самом деле, у него гораздо более богатый набор точек расширяемости. В вашем конкретном случае, я думаю, что пользовательское поведение, которое добавляет MessageInspector, вероятно, будет работать.
На самом деле существует два интерфейса инспектора сообщений: один для клиента ( IClientMessageInspector) и один для сервера ( IDispatchMessageInspector).
Самый простой способ подключить инспектор диспетчеризации на стороне службы - это поведение службы (IServiceBehavior), поскольку вы можете подключить его к реализации службы в качестве настраиваемого атрибута. Вот простой пример того, как это сделать. Вы также можете подключить его через IEndpointBehavior, но вам нужно сделать это либо с помощью кода при настройке хоста службы, либо с помощью конфигурации, которая требует написания немного больше кода.
На стороне клиента вы все еще используете поведение конечных точек, но вводить их с помощью кода намного проще, поскольку у вас есть прямой доступ к ClientRuntime из прокси-клиента.
В любом случае, я думаю, что что-то вроде отметки времени лучше добавить в сообщение в качестве настраиваемого заголовка, чтобы оно не было частью непосредственно полезной нагрузки сообщения.
Хм... это сложно. Проблема в том, что вы даже не можете убедиться, что таймеры клиента и сервера синхронизированы.
Если вы хотите отправить некоторые внеполосные данные, чтобы вам не нужно было изменять ваши методы, вы можете использовать метод, предложенный здесь. Я думаю, этого должно быть достаточно.