WCF MesageContract - настройка исходящего сообщения SOAP - несколько тел

Мне нужно вызвать веб-службу, которая чрезвычайно требовательна (нестандартна) в отношении формата сообщений SOAP, который она выбирает для обработки. У меня нет контроля над реализацией на стороне сервера, и нет доступного WSDL, все, что у меня есть, это перехваченное сообщение, прикрепленное ниже.

Моей первой мыслью было WCF+MessageContract, но что бы я ни делал с последним, я не могу получить правильный результат. Исходящие сообщения должны выглядеть так, как показано ниже. Кажется, что самая сложная часть состоит из нескольких частей тела ("ProxyInfo" и "PayloadInfo" ниже). Кроме того, я также не могу заставить WCF удалить элемент "Action" из заголовка сообщения SOAP. Я понимаю, что это жизненно важный элемент для WCF, но я сомневаюсь, что смогу убедить веб-сервис принять его. Ответ, вероятно, будет другой историей, но я перейду этот мост, когда доберусь до него.

В настоящее время я рассматриваю возможность индивидуальной сериализации и пост-/ предварительной обработки исходящих / входящих сообщений. В худшем случае, я думаю, мне придется выполнять веб-запросы, а также сериализацию вручную. Пожалуйста, помогите, я действительно отчаялся...

<?xml version="1.0" encoding="UTF-8" ?>
<e:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
 <e:Header>
  <ServiceHeader xmlns="http://services/serviceheader" e:actor="http://services/loadbalancer" >
   <ServiceLevel>
    <Type>HIGH</Type>
    <Method>FIFO</Method>
   </ServiceLevel>
  </ServiceHeader>
 </e:Header>
 <e:Body>
  <ProxyInfo xmlns="http://services/proxyinfo">
   <Server>
    <Address>proxy1:8080</Address>
    <AppId>case_delegator</AppId>
   </Server>
  </ProxyInfo>
  <PayloadInfo xmlns="http://services/payload">
   <GetConfirmation>
    <CaseId>
     <Id>9728DFC889874CC8B1505D91E33FCFCD</Id>
    </CaseId>
   </GetConfirmation>
  </PayloadInfo>
 </e:Body>
</e:Envelope>

1 ответ

Решение

Если вы не хотите использовать заголовок адреса, вы должны использовать привязку без WS-Addressing. В вашем случае используйте BasicHttpBinding. Он не будет использовать заголовок WS-Addressing и Action SOAP, но вместо этого будет использовать HTTP-заголовок SOAPAction.

Для вашего сообщения контракта попробуйте использовать что-то вроде этого:

[DataContract]
public class ServiceHeader
{
  ...
}

[DataContract]
public class ProxyInfo
{
  ...
}

[DataContract]
public class PayloadInfo
{ 
  ...
}

[MessageContract(IsWrapped = false)]
public class Request
{
  [MessageHeader(Namespace="http://services/serviceheader")]
  public ServiceHeader ServiceHeader { get; set; }

  [MessageBodyMember(Namespace="http://services/proxyinfo")]
  public ProxyInfo ProxyInfo { get; set; }

  [MessageBodyMember(Namespace="http://services/payload")]
  public PayloadInfo PayloadInfo { get; set; }
}

Странная вещь - это атрибут актера в ServiceHeader. Ваше сообщение не определяет пространство имен для префикса e, поэтому сообщение не является допустимым XML.

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