Мне нужно создать службу WCF, которая будет эмулировать некоторые сторонние службы. Этот сервис имеет очень сложные сообщения и оболочки для них, поэтому я упросту их в описании.
У меня есть WSDL этого сервиса и создан прокси-класс. Но здесь возникает первая проблема: все методы в прокси имеют
[System.ServiceModel.OperationContractAttribute(Action = "", ReplyAction = "*")]
Таким образом, невозможно создать службу WCF со многими методами: каждый для одного метода в прокси, потому что каждый метод должен иметь уникальное действие. Я думаю, что сторонний сервис имеет один метод, который обрабатывает все запросы. И я создал такой метод с необходимыми атрибутами KnownType для RequestTypeBase и ResponceTypeBase. Все методы прокси-класса имеют один параметр типа, производный от RequestTypeBase.
А вот основная проблема и вопрос: когда служба WCF пытается десериализовать тело сообщения, она выдает исключение, говорящее, что ожидаемое elementName - это «Процесс» (имя моего мегамодета, который обрабатывает все запросы), но существующим elementName является «RequestType1» (класс имени с данными, которые должны быть переданы методу «Process» в качестве параметра). Так как я могу получить такое сообщение ?? Есть ли какой-то атрибут в WCF, чтобы не требовать methodName в качестве корня тела сообщения? И я даже не понимаю, для чего WCF нужен этот MethodName, если он уже знает, какой метод вызывается? Выглядит как избыточность со спецификацией действия.
Может быть, простой пример MessabeBody, который успешно обрабатывается WCF, поможет понять, что я имею в виду:
<s:Body>
<TestMethod xmlns="someNamespace">
<x>1</x>
<str>param2</str>
</TestMethod>
</s:Body>