使用MessageContract属性时出现问题:异常 - >从命名空间'http://schemas.xmlsoap.org/soap/envelope/'结束元素'Body'

时间:2011-06-07 09:35:50

标签: wcf web-services wcf-binding wcf-security wse

我正在将我的WSE3 Web服务移动到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 :(得分:0)

在响应中使用的MessageContract没有问题。问题在于OperationContract的输入参数。

当我查看旧的WSE3 Web服务代理方法(WebMethod)并在WCF服务中为其创建OperationContract时,我创建的OparationContract不接受任何参数。

在调查此问题时,我使用svcutil.exe从旧WSE3服务的WSDL创建.NET类。当我查看具体的OperationContract时,我发现我需要创建一个MessageContract,它将用作OperationContract的请求参数。所以我创建了MessageContract而没有任何MessageBodyMember。当我使用它时,问题得到了解决。

显然,如果我们将OperationContract签名与ASMX WebMethod签名进行比较,它们就不会匹配,因为我们已经引入了输入参数。但这很有效。我不知道如何以及为什么。 如果有人解释为什么会这样做会很棒。