我对当前的项目有点担心。我们有一个拒绝遵守合同的集成合作伙伴,他们期望一个带有自定义标头的错误合同,而不是包含相同标头和合同有效消息正文的 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 属性合同?