Записываете контракт данных в заголовки конверта SOAP для исходящего исключения FaultException?
Я немного расстроен текущим проектом. У нас есть партнер по интеграции, который отказывается соответствовать контракту, и они ожидают контракт с ошибками с пользовательскими заголовками, а не контракт с сообщениями, определенный WSDL, который включает те же заголовки и тело сообщения, действующее на контрактной основе. Не является проблемой отправить ошибку SOAP с WCF, так как можно просто бросить FaultException
, Реальная привязка - это требование, чтобы ошибка содержала пользовательские заголовки. Мне удалось сериализовать пользовательский заголовок с помощью OperationContext
Однако он не сериализует, как того требует наш партнер по интеграции.
С помощью OperationContext.Current.OutgoingMessageHeaders
, можно создать кастом MessageHeader<T>
который содержит объект, который вы хотите включить в заголовок... это может быть POCO, DataContract или MessageContract. При использовании контракта сообщений, пространства имен, кажется, игнорируются, и сериализованное сообщение имеет кучу недопустимых атрибутов xmlns= для каждого элемента сообщения, что также является проблемой. Как только MessageHeader создан, вызывая .GetUntypedHeader(name, namespace)
метод будет генерировать MessageHeader
это может быть добавлено к OutgoingMessageHeaders OperationContext. Проблема в том, что вы не можете добавить объект в заголовки напрямую... они, по-видимому, всегда должны быть перенесены, так как метод 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
, имеет три дочерних элемента, мы, вероятно, были бы в бизнесе. Однако невозможно создать заголовок сообщения напрямую, который обернет три отдельных объекта, и при использовании MessageContract с IsWrapped=false
, каждый прямой дочерний элемент imsx_syncResponseHeaderInfo
элемент сериализуется с xmlns
атрибут, который определяет неправильное пространство имен (похоже, он принимает TNS из контракта на обслуживание). Это делает заголовок недействительным в соответствии с договорной схемой, и потребитель не может десериализовать его.
Есть ли какой-то способ добавить MessageContract к заголовкам исходящих сообщений сбоя SOAP, доставляемого WCF, не требуя его обертывания, и сделать так, чтобы дочерние элементы не сериализовались каждый со своим собственным атрибутом xmlns, содержащим TNS службы контракт?
1 ответ
Как указано выше:
На самом деле проблема была в том, как бизнес-партнер десериализировал содержимое нашего сообщения. Они не хотели брать на себя ответственность за проблему в то время, и бремя легло на мою команду и меня. Нам, наконец, удалось заставить их решить свою проблему, поэтому нам никогда не приходилось решать проблему.