C # SOAP Service - Удалить узел метода и иметь заголовок в узле soapheader - PullRequest
0 голосов
/ 09 февраля 2019

Мне поручено создать веб-сервис, соответствующий определенному wsdl, и я раньше не использовал SOAP или asmx.

Когда я создаю запрос в SoapUI, я получаю следующую структуру:так же, как клиент будет использовать для отправки запросов.(с использованием имен заполнителей)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:par="http://www.foo.com/schemas/method">
   <soapenv:Header>
      <par:SOAPHeaderRequest>
         <par:ApplicationID>ID</par:ApplicationID>
      </par:SOAPHeaderRequest>
   </soapenv:Header>
   <soapenv:Body>
      <par:Body>
      </par:Body>
   </soapenv:Body>
</soapenv:Envelope>

Однако, когда я пытаюсь создать службу, у меня есть такая структура:

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <Method xmlns="http://www.foo.com/schemas/method">
      <request>
        <SOAPHeaderRequest>
          <ApplicationID>string</ApplicationID>
        </SOAPHeaderRequest>
        <body>
          <Property>string</Property>
        </body>
      </request>
    </Method>
  </soap:Body>
</soap:Envelope>

Я хотел бы знать, как удалить методобертка узла и как переместить SOAPHeaderREquest в soap: Header.

Вот мой пример кода:

интерфейс и объекты

 [ServiceContract(Namespace = "http://www.foo.com/schemas/method")]
 public interface IServiceContract
 {
     [XmlSerializerFormat]
     [OperationContract]
     ResponseObject Method(RequestObject request);
 }

 [System.Serializable()]
 [System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://www.foo.com/schemas/method")]
 [MessageContract(IsWrapped = false)]
 public class RequestObject
 {
     [System.ServiceModel.MessageHeader(Namespace = "http://www.foo.com/schemas/method")]
     public SOAPHeaderRequest SOAPHeaderRequest;

     [System.ServiceModel.MessageBodyMember(Namespace = "http://www.foo.com/schemas/method", Order = 0)]
     public Body body;

     public RequestObject()
     {
     }

     public RequestObject(SOAPHeaderRequest SOAPHeaderRequest, Body body)
     {
         this.body = body;
     }
 }

 [System.Serializable()]
 [System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://www.foo.com/schemas/method")]
 [MessageContract(IsWrapped = false)]
 public class ResponseObject
 {
     [System.ServiceModel.MessageHeader(Namespace = "http://www.foo.com/schemas/method")]
     public SOAPHeaderResponse SOAPHeaderResponse;

     [System.ServiceModel.MessageBodyMember(Namespace = "http://www.foo.com/schemas/method", Order = 0)]
     public Body body;
 }


 [System.Serializable()]
 public class Body
 {
     public string Property { get; set; }
 }

asmx

[WebService(Namespace = "http://www.foo.com/schemas/method")]
[WebServiceBinding(ConformsTo = WsiProfiles.None)]
public class M5NapaPartUpdateService : WebService, IServiceContract
{
    [WebMethod]
    [SoapMethod(SoapAction = "method")]
    public ResponseObject Method(RequestObject request)
    {
        return new ResponseObject();
    }
}

Дайте мне знать, если вам что-нибудь понадобится.

Спасибо!

1 Ответ

0 голосов
/ 09 февраля 2019

WSDL различает два стиля сообщений: документ и RPC.

Стиль сообщения влияет на содержимое тела SOAP: Стиль документа: Тело SOAP содержит один или несколько дочерних элементов, называемых частями.Нет никаких правил форматирования SOAP для того, что содержит тело;он содержит все, с чем согласны отправитель и получатель.

** Стиль RPC: ** RPC подразумевает, что тело SOAP содержит элемент с именем вызываемого метода или операции.Этот элемент, в свою очередь, содержит элемент для каждого параметра этого метода / операции.

Ваш wsdl написан в стиле Document Literal.

Если вы используете сервисный контракт, то, я полагаю, вы используете WCF-фреймворк для написания сервисного кода.

Вы можете указать следующие параметры для создания WSDL, как вы ожидаете.

 [ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples"), XmlSerializerFormat(Style = OperationFormatStyle.Document, 
                             Use = OperationFormatUse.Literal)]

Reference- https://www.ibm.com/support/knowledgecenter/en/SSB27H_6.2.0/fa2ws_ovw_soap_syntax_lit.html

Надеюсь, это поможет.

...