Помогите отладке WCF - PullRequest
       1

Помогите отладке WCF

1 голос
/ 13 сентября 2010

Я новичок в программировании WCF и нахожу процесс обучения довольно разочаровывающим. Насколько я могу судить, WCF (и WPF, в этом отношении) по умолчанию будет скрывать от вас ошибок. До сих пор у меня возникали следующие проблемы, и в Visual Studio или во время выполнения практически отсутствовало указание на то, что что-то не так (кроме моего приложения, просто не работающего):

  • ссылка на службу не актуальна (почему VS не делает это автоматически?);
  • тип в сервисном методе не может быть сериализован;
  • служба пыталась передать больше данных, чем позволяют значения по умолчанию.

Предположительно, есть какой-то простой способ сделать эти проблемы видимыми для меня, разработчика. Если кто-нибудь может сказать мне, что это, я был бы очень признателен (часы поиска в Google не дали рабочего ответа)!

Я также был бы признателен за объяснение, если кто-нибудь знает, почему стандартное поведение WCF и WPF заключается в тихом скрытии таких ошибок. Это кажется странным, если не сказать больше.

Ответы [ 3 ]

3 голосов
/ 13 сентября 2010

Полагаю, вы неправильно поняли элементарные идеи веб-сервисов. WCF - это API для создания веб-сервисов. Веб-сервисы, в отличие от RPC, должны использоваться независимо. Это означает, что вы можете создать веб-сервис, не зная приложения, которое будет его использовать (вы можете открыть веб-сервис в Интернете или для делового партнера). Это большая разница для RPC, где клиент и сервис большую часть времени строятся вместе. Исходя из элементарных правил безопасности, сервисные исключения не отправляются клиенту по умолчанию. Вы не хотите раскрывать внутреннюю информацию своим неизвестным клиентам.

На ваши вопросы:

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

Тип не может быть сериализован: веб-сервисы используют совместимый формат для обмена данными. Как вы думаете, компилятор должен знать, является ли тип сериализуемым? Должен ли он выполнять сериализацию всех типов данных во время каждой сборки? Как предположил Джон, это можно легко обнаружить с помощью правильной стратегии тестирования.

Служба пытается передать больше данных, чем позволяет клиент. Что вы подразумеваете под этим? Вы имеете в виду, что сервис может передавать дополнительные поля, которые неизвестны клиенту из-за новой версии сервиса? В этом случае вы жалуетесь на одну из самых важных функций управления версиями. Или вы имеете в виду, что сервис может отправить больше сообщения, чем позволяет клиент? В таком случае, как служба должна знать, какой размер разрешен для неизвестного клиента? Размер MaxReceiveMessage является защитой от атаки типа «отказ в обслуживании» и контролируется принимающей стороной. Если вам нужно обрабатывать динамический размер сообщения в вашем сообщении, вы должны его кодировать.

Скрытие ошибок: по умолчанию каждый сервис имеет такую ​​конфигурацию в своем поведении:

<serviceDebug includeExceptionDetailInFault="false" />

Просто измените это значение на истинное. Отслеживание WCF + отслеживание сокетов и Регистрация сообщений WCF , и вы получите лучший диагностический арсенал, который когда-либо был у MS предоставляется в .NET разработчикам .

3 голосов
/ 13 сентября 2010

Вы полностью ошибаетесь. WCF не скрывает от вас ошибок. Вы просто не должны искать в правильном месте.

Вы смотрели в журнале событий Windows (приложение)? Вы включили трассировку WCF?

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

Как вы ожидаете узнать об ошибке сериализации без сериализации? Если вы хотите быть уверены, что ваша сериализация работает, то создайте модульный тест, который сериализует!

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

1 голос
/ 13 сентября 2010

Ответ на один из ваших пунктов:

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

См. в этой презентации для более подробного изучения.

...