Как управлять вложением параметров метода веб-службы в дополнительный элемент

Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation.

Параметры или возвращаемые значения для метода веб-службы можно автоматически инкапсулировать в родительском элементе XML в элементе Body сообщения SOAP либо привязывать их непосредственно к элементам part сообщения в документе WSDL. В .NET Framework эти два способа называются "Wrapped" и "Bare" (соответственно) и управляются с помощью атрибутов.

Указание об инкапсуляции параметров в одном элементе XML

  1. Примените атрибут SoapDocumentMethod к методу в прокси-классе, вызывающему нужный метод веб-службы, присваивающий свойству ParameterStyle значение Wrapped.

    В следующем примере кода свойству ParameterStyle задается значение Wrapped. Кроме того, стилю форматирования параметра задается значение Literal.

    [SoapDocumentMethod("http://www.contoso.com/DocumentWrappedLiteral",
                        RequestNamespace="http://www.contoso.com",
                        ResponseNamespace="http://www.contoso.com", 
                        Use=SoapBindingUse.Literal, 
                        ParameterStyle=SoapParameterStyle.Wrapped)]
    public string DocumentWrappedLiteral(Address1 address, 
                                         bool useZipPlus4) {
    
    <SoapDocumentMethod("http://www.contoso.com/DocumentWrappedLiteral", _
                        RequestNamespace:="http://www.contoso.com", _
                        ResponseNamespace:="http://www.contoso.com", _
                        Use:=SoapBindingUse.Literal, _
                        ParameterStyle:=SoapParameterStyle.Wrapped)> _
    Public Function DocumentWrappedLiteral(ByVal address As Address1, _
                                 ByVal useZipPlus4 As Boolean) As String
    

    XML-часть запроса SOAP инкапсулирует параметры в элементе, которому по умолчанию задается имя, идентичное имени метода веб-службы.

    <?xml version="1.0" encoding="utf-8"?>
    <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>
        <DocumentWrappedLiteral xmlns="http://www.contoso.com">
          <MyAddress>
            <Street>string</Street>
            <City>string</City>
            <Zip>string</Zip>
          </MyAddress>
          <useZipPlus4>boolean</useZipPlus4>
        </DocumentWrappedLiteral>
      </soap:Body>
    </soap:Envelope>
    

    XML-часть ответа SOAP инкапсулирует параметры out для метода веб-службы (в том числе результат) в элементе. В качестве имени инкапсулирующего элемента по умолчанию используется имя метода веб-службы, в конце которого добавляется Response.

    <?xml version="1.0" encoding="utf-8"?>
    <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>
        <DocumentWrappedLiteralResponse xmlns="http://www.contoso.com">
          <DocumentWrappedLiteralResult>string
          </DocumentWrappedLiteralResult>
        </DocumentWrappedLiteralResponse>
      </soap:Body>
    </soap:Envelope>
    

Указание о следовании параметров непосредственно за элементом Body

  1. Примените атрибут SoapDocumentMethod к методу в прокси-классе, вызывающему нужный метод веб-службы, присваивающий свойству ParameterStyle значение Bare.

    Следующий пример кода, созданный программой Wsdl.exe, задает свойству ParameterStyle значение Bare, а стилю форматирования параметра — значение Literal. Поскольку пространство имен нельзя указать в элементе, инкапсулирующем все параметры, необходимо указать его отдельно для каждого параметра и возвращаемого значения. Для этого достаточно применить атрибут XmlElementAttribute к каждому параметру и возвращаемому значению и задать свойство Namespace.

    [SoapDocumentMethod(
         "http://www.contoso.com/DocumentBareLiteral",
         Use=SoapBindingUse.Literal,
         ParameterStyle=SoapParameterStyle.Bare)]
    [return: XmlElement(Namespace="http://www.contoso.com",                    IsNullable=true)]
    public string DocumentBareLiteral(
       [XmlElement(Namespace="http://www.contoso.com",
                         IsNullable=true)] 
       Address1 MyAddress, 
       [XmlElement(Namespace="http://www.contoso.com",
                IsNullable=false)] 
       bool useZipPlus4) {
    
    <SoapDocumentMethod( _
         http://www.contoso.com/DocumentBareLiteral", _
         Use:=SoapBindingUse.Literal, _
         ParameterStyle:= SoapParameterStyle.Bare)> _
    Public Function DocumentBareLiteral( _
       ByVal <XmlElement([Namespace]:="http://www.contoso.com", _
                          IsNullable:=true)> _
       MyAddress As Address1, _
       ByVal <XmlElement([Namespace]:="http://www.contoso.com", _
                          IsNullable:=false)> _
       useZipPlus4 As Boolean) _
       As <XmlElement([Namespace]:="http://www.contoso.com", _
                      IsNullable:=true)> _
       String
    

    Элементы XML, с которыми сопоставлены параметры в запросе SOAP, следуют непосредственно за элементом Body, и каждый из них указывает пространство имен.

    <?xml version="1.0" encoding="utf-8"?>
    <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>
        <MyAddress xmlns="http://www.contoso.com">
          <Street>string</Street>
          <City>string</City>
          <Zip>string</Zip>
        </MyAddress>
        <useZipPlus4 xmlns="http://www.contoso.com">boolean</useZipPlus4>
      </soap:Body>
    </soap:Envelope>
    

    Параметры out, включая возвращаемое значение, сопоставляются с элементами XML, следующими за элементом Body в сообщении SOAP. В качестве имени элемента возвращаемого значения по умолчанию задается имя метода веб-службы с суффиксом Result.

    <?xml version="1.0" encoding="utf-8"?>
    <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>
        <DocumentBareLiteralResult xmlns="http://www.contoso.com">
           string</DocumentBareLiteralResult>
      </soap:Body>
    </soap:Envelope>
    

См. также

Справочник

SoapDocumentMethodAttribute
SoapRpcMethodAttribute

Другие ресурсы

Настройка форматирования сообщения SOAP