【问题标题】:Problem while using MessageContract attribute : Exception -> End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected使用 MessageContract 属性时出现问题:Exception -> End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' 预期
【发布时间】:2011-06-07 09:35:50
【问题描述】:

我正在将我的 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属性。

我需要检查/验证哪些事项? 如果需要,我可以提供类代码 sn-ps。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    显然,如果我们将OperationContract 签名与ASMX WebMethod 签名进行比较,它们不匹配,因为我们引入了输入参数。但这有效。我不知道如何以及为什么。 如果有人解释它为什么起作用,那就太好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多