私は現在のプロジェクトで少し困っています。コントラクトへの準拠を拒否している統合パートナーがいます。彼らは、同じヘッダーと契約上有効なメッセージ本文を含む 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
ヘッダー に3 つの子要素があるという事実がなければ、私たちはおそらく仕事をしていたでしょう。ただし、3 つの個別のオブジェクトをラップするメッセージ ヘッダーを直接作成することは不可能であり、MessageContract を で使用するとIsWrapped=false
、要素のすべての直接の子要素が、正しくない名前空間を定義する属性でimsx_syncResponseHeaderInfo
シリアル化されます (xmlns
サービス契約)。これにより、契約上のスキーマに従ってヘッダーが無効になり、コンシューマーはヘッダーを逆シリアル化できなくなります。
WCF 配信の SOAP フォールトの送信メッセージ ヘッダーに MessageContract を追加する方法はありますか?契約する?