2

我对当前的项目有点担心。我们有一个拒绝遵守合同的集成合作伙伴,他们期望一个带有自定义标头的错误合同,而不是包含相同标头和合同有效消息正文的 WSDL 定义的消息合同。使用 WCF 发送 SOAP 错误不是问题,因为可以简单地抛出FaultException. 真正的绑定是要求故障包含自定义标头。我能够使用 来序列化自定义标头OperationContext,但是它不会按照我们的集成合作伙伴要求的方式进行序列化。

使用OperationContext.Current.OutgoingMessageHeaders,可以创建MessageHeader<T>包含您希望包含在标头中的对象的自定义...它可以是 POCO、DataContract 或 MessageContract。当使用消息契约时,命名空间似乎被忽略了,序列化的消息在消息的每个成员上都有一堆无效的 xmlns= 属性,这也是一个问题。创建 MessageHeader 后,调用该.GetUntypedHeader(name, namespace)方法将生成一个MessageHeader可以添加到 OperationContext 的 OutgoingMessageHeaders 中。问题是您不能直接将对象添加到标头...它们显然必须始终被包装,因为 GetUntypedHeader 方法需要包装器元素名称和命名空间。

所需的标头如下:

   <SOAP-ENV:Header>
      <imsx_syncResponseHeaderInfo xmlns="http://www.imsglobal.org/services/lti/xsd/CoreOutcomesService_bv1p0">
         <imsx_version>UNUSED</imsx_version>
         <imsx_messageIdentifier>12345678-abcd-1234-ef00-1234567890ab</imsx_messageIdentifier>
         <imsx_statusInfo>
            <imsx_codeMajor>failure</imsx_codeMajor>
            <imsx_severity>error</imsx_severity>
            <imsx_messageRefIdentifier>12345</imsx_messageRefIdentifier>
            <imsx_description>yadda yadda some error message here</imsx_description>
            <imsx_codeMinor>
               <imsx_codeMinorField>
                  <imsx_codeMinorFieldName>SomeCodeName</imsx_codeMinorFieldName>
                  <imsx_codeMinorFieldValue>somecode</imsx_codeMinorFieldValue>
               </imsx_codeMinorField>
            </imsx_codeMinor>
         </imsx_statusInfo>
      </imsx_syncResponseHeaderInfo>
   </SOAP-ENV:Header>

如果不是因为标题 ,imsx_syncResponsHeaderInfo具有三个子元素,我们可能会做生意。但是,不可能直接创建包装三个单独对象的消息头,并且IsWrapped=false当使用imsx_syncResponseHeaderInfo带有xmlns服务合同)。根据合同模式,这会使标头无效,并且消费者无法反序列化它。

是否有某种方法可以将 MessageContract 添加到 WCF 传递的 SOAP 错误的传出消息标头中,而不需要对其进行包装,并且这样子元素就不会被序列化,每个子元素都具有自己的包含服务 TNS 的 xmlns 属性合同?

4

1 回答 1

0

如上所述:

问题实际上是由于业务合作伙伴如何反序列化我们的消息内容。他们当时不想为这个问题负责,负担就落在了我和我的团队身上。我们终于设法让他们解决了他们自己的问题,所以我们实际上从来没有解决这个问题。

于 2014-10-01T18:20:08.487 回答