Получение SOAP-сообщений с определенной схемой в .NET - PullRequest
0 голосов
/ 07 января 2011

Я пишу сервис в .NET, который получает объекты XML в конверте SOAP, который примет это сообщение и ответ с сообщением SOAP, используя ту же схему. Например:

Запрос:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body xmlns="http://schemas.mystuff.org/myschema">
    <Message>
      <Header>...</Header>
      <MessageContent>...</MessageContent>
    </Message>
  </s:Body>
</s:Envelope>

Ответ:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body xmlns="http://schemas.mystuff.org/myschema">
    <Message>
      <Header>...</Header>
      <MessageContent>...</MessageContent>
    </Message>
  </s:Body>
</s:Envelope>

Кроме того, я хотел бы закончить не иерархией объектов, а просто строкой XML.

Когда я использую WCF ServiceContracts, чтобы сделать это, WCF определяет дополнительный слой оболочек для сгенерированной им службы WSDL, например:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header />
  <s:Body>
    <SendMessageResponse xmlns="http://tempuri.org/">
      <SendMessageResult xmlns:a="http://schemas.datacontract.org/2004/07/CxMessageReceiverRole" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:Message>
          ...
        </a:Message>
      </SendMessageResult>
    </SendMessageResponse>
  </s:Body>
</s:Envelope>

Как лучше всего получать и отправлять SOAP-сообщения в .NET, где я контролирую, как выглядят эти сообщения, а не WCF? Это не обязательно должен быть WCF, если это не лучший способ. Кроме того, я не хочу реализовывать всю структуру классов для представления моей схемы XML, а вместо этого просто получаю тело SOAP в виде строки.

1 Ответ

1 голос
/ 07 января 2011

Сначала вы не можете получить тело SOAP в виде строки, если вы не отправляете строку. Вы можете получить только XML, но в этом случае ваш автоматически сгенерированный WSDL не будет содержать описание вашего формата тела. Он будет определять только xsd:any, что означает любой правильно сформированный XML.

Если вы не хотите иметь элемент обтекания, вы должны использовать MessageContract вместо DataContract. DataContracts всегда использует элементы переноса по умолчанию на основе имени операции. MessageContracts переопределяет это поведение и определяет элемент верхнего уровня.

Я предлагаю что-то вроде этого:

[MessageContract]
public class Message
{
  [MessageBodyMember]
  public XElement Header { get; set; }
  [MessageBodyMember]
  public XElement MessageContent { get; set; }
}

Другой подход - использование класса System.ServiceModel.Channels.Message и чтение содержимого сообщения вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...