私は現在のプロジェクトでピンクになっています。契約に従うことを拒否する統合パートナーがあり、同じヘッダーと契約上有効なメッセージ本文を含むWSDL定義のメッセージ契約ではなく、カスタムヘッダーでの障害契約が予想されます。 FaultException
を単に投げることができるので、WCFでSOAP障害を送信することは問題ではありません。実際のバインドは、カスタムヘッダーがフォルトに含まれている必要があります。 OperationContext
を使用してカスタムヘッダーをシリアル化することはできましたが、統合パートナーに必要な方法をシリアル化しません。発信FaultExceptionのSOAPエンベロープヘッダーにデータコントラクトを書き込む?
OperationContext.Current.OutgoingMessageHeaders
を使用すると、ヘッダーに含めるオブジェクトを含むカスタムMessageHeader<T>
を作成することができます。これは、POCO、DataContract、またはMessageContractにすることができます。メッセージコントラクトを使用する場合、名前空間は無視されるように見えますが、シリアライズされたメッセージには、メッセージの各メンバーに無効なxmlns =属性が多数含まれています(これも問題です)。 MessageHeaderが作成されると、.GetUntypedHeader(name, namespace)
メソッドを呼び出すと、OperationContextのOutgoingMessageHeadersに追加できるMessageHeader
が生成されます。問題は、ヘッダーにオブジェクトを直接追加することができないことです。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つの別個のオブジェクトをラップするメッセージヘッダーを直接作成することは不可能であり、IsWrapped=false
のMessageContractを使用すると、imsx_syncResponseHeaderInfo
要素のすべての直接子要素は、不正な名前空間を定義するxmlns
属性でシリアル化されます。サービス契約のTNS)。これにより、契約スキーマに従ってヘッダーが無効になり、消費者はそれを逆シリアル化できません。
WCFで配信されたSOAPフォールトの送信メッセージヘッダーにMessageContractを追加する方法はありますか。ラップする必要はありません。子要素はそれぞれ独自のxmlns属性サービス契約のTNS?
これまでの解決策はありましたか?私はまったく同じ問題に遭遇し、解決できません。 –
問題は、ビジネスパートナーがメッセージの内容をどのように逆シリアル化していたかが原因でした。彼らは当時の問題に責任を負うことを望んでおらず、私のチームと私は負担が減りました。私たちは最終的に自分たちの問題を解決することができたので、実際に問題を解決する必要はありませんでした。 – jrista