Проблема при использовании атрибута MessageContract: Exception -> End element 'Body' из пространства имен 'http://schemas.xmlsoap.org/soap/envelope/' ожидается - PullRequest
0 голосов
/ 07 июня 2011

Я перемещаю свои веб-службы WSE3 в WCF.Но клиент - это клиент WSE3.

Все контракты на операции возвращают экземпляр классов MessageContract.Это работает для 2 операций, но почему-то не удается для одной операции одного и того же контракта на обслуживание.Ошибка:

The signature or decryption was invalid.

Когда я просматриваю файл трассировки WCF, я обнаружил следующее:

The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation 'MyOperationName'. End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected. Found element 'MyOperationName' from namespace 'urn:MyProject:MyModule:2006:04:MyAuthorizationModule'.

Я наблюдал, когда яиспользовать атрибут XmlRoot для украшения класса ответа (вместо использования атрибута MessageContract), я не получаю это исключение.Однако объект ответа не может быть десериализован.то есть я вижу ответ XML во входной трассировке, но поскольку ожидаемая структура XML не совпадает, вызов службы возвращает null на стороне клиента.

Класс MessageContract имеет только одно открытое свойство (MessageBodyMember), который возвращает экземпляр другого класса, который украшен атрибутом XmlRoot.Этот класс (который украшен xmlRoot) имеет свойство, которое дает Collection объектов некоторого класса сущностей, у которого есть XmlElement свойства.

Какие все вещи мне нужно проверить / проверить?Я могу предоставить фрагменты кода класса, если требуется.

1 Ответ

0 голосов
/ 15 июня 2011

Не было проблем с MessageContract, который использовался в ответе.Проблема была с входным параметром для OperationContract.

Когда я посмотрел на старый метод прокси веб-службы WSE3 (WebMethod) и создал для него OperationContract в службе WCF, OparationContract Iсозданный не принял ни одного параметра.

При исследовании этой проблемы я использовал svcutil.exe для создания классов .NET из WSDL старой службы WSE3.Когда я посмотрел на конкретный OperationContract, я узнал, что мне нужно создать MessageContract, который будет использоваться в качестве параметра запроса для OperationContract.Поэтому я создал MessageContract без MessageBodyMember.Когда я его использовал, проблема была решена.

Очевидно, что если мы сравним подпись OperationContract с подписью ASMX WebMethod, они не будут совпадать, поскольку мы ввели входной параметр.Но это работает.Я не знаю как и почему. Было бы замечательно, если бы кто-то объяснил, почему это работает.

...