У меня есть простая эхо-служба, в которой я определил один метод работы и пару типов для запроса / ответа:

[ServiceContract(Name = "EchoService", 
                 Namespace = "http://example.com/services", 
                 SessionMode = SessionMode.NotAllowed)]
public interface IEchoService
{
    [OperationContract(IsOneWay = false,
                       Action = "http://example.com/services/EchoService/Echo", 
                       ReplyAction = "http://example.com/services/EchoService/EchoResponse")]
    EchoResponse Echo(EchoRequest value);
}

Типы данных:

[Serializable]
[DataContract(Namespace = "http://example.com/services/EchoService", 
              Name = "EchoRequest")]
public class EchoRequest
{
    public EchoRequest() { }

    public EchoRequest(String value)
    {
        Value = value;
    }

    [DataMember]
    public String Value { get; set; }
}

[Serializable]
[DataContract(Namespace = "http://example.com/services/EchoService", 
              Name = "EchoResponse")]
public class EchoResponse
{
    public EchoResponse() { }

    public EchoResponse(String value)
    {
        Value = value;
    }

    [DataMember]
    public String Value { get; set; }
}

Вызов Message.CreateMessage () для экземпляра EchoRequest дает:

  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header />
    <s:Body>
      <EchoRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/services/EchoService">
        <Value>hello, world!</Value>
      </EchoRequest>
    </s:Body>
  </s:Envelope>

... именно этого я и хочу. Однако похоже, что служба ожидает, что тело сообщения будет дополнительно заключено в другой элемент XML, например:

  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header />
    <s:Body>
      <Echo xmlns="http://example.com/services">
        <EchoRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/services/EchoService">
          <Value>hello, world!</Value>
        </EchoRequest>
      </Echo>
    </s:Body>
  </s:Envelope>

ОБНОВЛЕНИЕ: Благодаря ответу Марка я изучил MessageContract вместо DataContract по типам запроса / ответа. Это кажется более близким к тому, что я хочу, но теперь это заходит слишком далеко и не ожидает элемента внешнего типа, «EchoRequest».

Это сбивает с толку, поскольку каким-то образом Message.CreateMessage, кажется, неизменно создает правильный XML, поэтому он, по-видимому, использует некоторую сериализацию по умолчанию, которую я хотел бы настроить для службы. Я просто неправильно понимаю, как работает Message.CreateMessage?

5
codekaizen 15 Июл 2009 в 12:03

2 ответа

Лучший ответ

В конце концов я переключился на использование контрактов сообщений с помощью TypedMessageConverter, с которым я познакомился через ответ на этот вопрос. Этого здесь не хватало.

1
Community 23 Май 2017 в 14:45