Управление сериализацией тела сообщений WCF - PullRequest
0 голосов
/ 15 декабря 2010


Мне нужно создать службу 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>

1 Ответ

0 голосов
/ 17 декабря 2010

Вы можете полностью пропустить десериализацию WCF на стороне обслуживания, используя «универсальный контракт на обслуживание»:

[ServiceContract]
public interface IUniversalRequestResponseContract
{
    [OperationContract(Action="*", ReplyAction="*")]
    Message ProcessMessage(Message msg);
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...