WSDL является контрактом. Это то же самое, что если у вас есть два объекта и определенный интерфейс между ними. Если первый объект вызывает операцию над вторым объектом, он ожидает возвращаемое значение, определенное интерфейсом. Если бы мы использовали какой-нибудь не строго типизированный язык, второй объект мог бы возвращать другой тип возвращаемого значения, и первый объект потерпел бы неудачу из-за непредвиденной ошибки.
Языки программирования имеют подход для решения этой проблемы - в случае .NET вы должны использовать тип object
в качестве возвращаемого значения, и вам всегда придется вручную исследовать, какой тип вы получили и как обрабатывать возвращаемое значение. В случае WCF у нас также есть такой высокоуровневый тип - System.ServiceModel.Channels.Message
, но вы действительно не хотите его использовать, потому что в этом случае вам придется создавать запрос SOAP вручную и анализировать входящие ответы вручную.
Как примечание в веб-службах, один тип запроса всегда имеет один тип ответа и ноль или более типов ошибок (которые являются ошибками SOAP). Если у вас есть служба, которая возвращает разные типы ответов для одного типа запроса, такая служба не является «действительной» веб-службой и не может быть описана WSDL. Из-за этого он не может быть строго типизирован и предоставлен автоматически сгенерированным прокси WCF.