Получение простого XML в службе .NET WCF - PullRequest
1 голос
/ 18 августа 2010

Я настраиваю действительно простую службу WCF, единственной задачей которой является получение XML-сообщения через SOAP и отправка сообщения во внутреннюю службу. Допустим, я создаю сторожевой пост таких. (Фактические имена были заменены, например)

Начальная информация:

  1. Я не могу изменить внешнюю службу, звонящую мне. Насколько я знаю, это клиент Soap11, встроенный в Java.

  2. В этом примере все имена были заменены на фиктивные.

Конечная точка-установка:

<service behaviorConfiguration="GuardpostBehavior" name="Guardpost.ContractImplementation">
    <endpoint address=""  binding="basicHttpBinding" contract="Guardpost.IContract" bindingConfiguration="basic">
     <identity>
      <dns value="localhost"/>
     </identity>
    </endpoint>
   </service>

Конфигурация переплета:

<basicHttpBinding>
  <binding name="basic" textEncoding="utf-8" messageEncoding="Text">
    <security mode="Transport" />
  </binding>
</basicHttpBinding>

(мне нужна Транспортная безопасность из-за https)

Мой контракт выглядит так:

[ServiceContract]
public interface IContract
{
  [OperationContract(Action="urn:#GuardpostReceive")]
  void GuardpostReceive(string inputXml);
}

Теперь я получаю сообщение в оболочке из мыла, в котором для Action задано значение urn: #GuardpostReceive, поэтому фактическая маршрутизация сообщения выполнена правильно.

Однако - Когда сообщение получено, оно фактически не помещается в метод из-за этой ошибки:

OperationFormatter обнаружил недопустимое тело сообщения. Ожидается найти тип узла «Элемент» с именем «inputXml» и пространством имен »http://tempuri.org/'. Найден тип узла« Элемент »с именем« extns: ExternalNodeName »и пространством имен« http://foo.com/bar.org/someservice/schema/1'

Кажется, проблема в том, что мой WCF-сервис не может извлечь тело сообщения Soap и просто передать его в виде простого XML, но это то, что мне нужно для этого.

Сталкивался ли я с showtopper в WCF?

Ответы [ 2 ]

2 голосов
/ 18 августа 2010

Вы можете определить контракт для получения всего сообщения SOAP и полностью пропустить маршрутизацию:

[ServiceContract]
public interface IUniversalRequestReply
{
    [OperationContract(Action = "*", ReplyAction = "*")]
    Message ProcessMessage(Message msg);
}

[ServiceContract]
public interface IUniversalOneWay
{
    [OperationContract(Action = "*", IsOneWay=true)]
    void ProcessMessage(Message msg);
}

Но я думаю, что вы не сможете сделать что-то вроде:

[ServiceContract]
public interface IContract
{
  [OperationContract(Action="urn:#GuardpostReceive")]
  void GuardpostReceive(Message inputXml);
}

Что вы пытаетесь достичь в реальной реализации операции?

0 голосов
/ 18 августа 2010

Если вы определяете параметр как String, вы должны передать закодированный XML - как .Если вам нужно передать незашифрованный XML, попробуйте использовать XmlElement или XElement в качестве параметра.

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