Записываете контракт данных в заголовки конверта 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 ответ

Как указано выше:

На самом деле проблема была в том, как бизнес-партнер десериализировал содержимое нашего сообщения. Они не хотели брать на себя ответственность за проблему в то время, и бремя легло на мою команду и меня. Нам, наконец, удалось заставить их решить свою проблему, поэтому нам никогда не приходилось решать проблему.

Другие вопросы по тегам