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

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

Язык WSDL предоставляет на выбор две возможности для общего форматирования текста сообщений SOAP, или стиля: RPC и Document. Платформа .NET Framework управляет этими вариантами в коде с помощью атрибутов.

Задание стиля форматирования Document

  1. Примените атрибут SoapDocumentMethod или атрибут SoapRpcMethod к методу в прокси-классе, который вызывает подходящий метод веб-службы.

    Веб-службы, созданные с применением ASP.NET, поддерживают использование обоих стилей форматирования параметров — Literal и Encoded. В следующем примере стиль форматирования Document сочетается со стилем форматирования параметров Literal.

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

    В описании службы определена схема XSD, задающая как запрос, так и ответ SOAP. Используется стиль форматирования Document. Ниже приведен отрывок описания службы с определением запроса SOAP для метода веб-службы DocumentWrappedLiteral. Так как первым параметром для метода веб-службы DocumentWrappedLiteral является класс и задан стиль форматирования параметров Literal, схема XSD создается для типа address.

    <s:element name="DocumentWrappedLiteral">
      <s:complexType>
        <s:sequence>
           <s:element minOccurs="1" maxOccurs="1" name="MyAddress"
                      nillable="true" type="s0:Address" /> 
           <s:element minOccurs="1" maxOccurs="1" name="useZipPlus4"
                      type="s:boolean" /> 
        </s:sequence>
      </s:complexType>
    </s:element>
    
    <s:complexType name="Address">
       <s:sequence>
          <s:element minOccurs="1" maxOccurs="1" name="Street"
                     nillable="true" type="s:string" /> 
          <s:element minOccurs="1" maxOccurs="1" name="City"
                     nillable="true" type="s:string" /> 
          <s:element minOccurs="1" maxOccurs="1" name="Zip" nillable="true"
                     type="s:string" /> 
       </s:sequence>
    </s:complexType>
    

    Для схемы XSD, определенной в описании службы, часть XML, представляющая запрос SOAP для метода службы DocumentWrappedLiteral, будет такой, как показано далее. Обратите внимание, что элементы XML, следующие за элементом Body в запросе SOAP, соответствуют элементам, определенным в схеме XSD.

    <?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>
    

Задание стиля форматирования RPC

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

    [SoapRpcMethodAttribute("http://www.contoso.com/Rpc",
                            RequestNamespace="http://www.contoso.com",
                            ResponseNamespace="http://www.contoso.com")]
    public Address Rpc(Address address, bool useZipPlus4) {
    
    <SoapRpcMethodAttribute("http://www.contoso.com/Rpc", _
                            RequestNamespace:="http://www.contoso.com", _
                            ResponseNamespace:="http://www.contoso.com")> _
    Public Function Rpc(ByVal address As Address, _
                        ByVal useZipPlus4 As Boolean) As Address
    

    В предыдущем примере в описании службы нет строгого определения схемы XSD ни для запроса, ни для ответа SOAP методу Rpc, скорее определены содержащие их фрагменты. Поэтому посмотрите на запрос SOAP для метода Rpc, обратите внимание, что параметры заключены в один элемент и кодированы с использованием форматирования параметров Encoded.

    <?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:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
                 xmlns:tns="http://www.contoso.com"
                 xmlns:tnsTypes="http://www.contoso.com/encodedTypes"
                 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <tns:Rpc>
          <address href="#1" />
          <useZipPlus4>boolean</useZipPlus4>
        </tns:Rpc>
        <tnsTypes:Address id="1">
          <Street id="2">string</Street>
          <City id="3">string</City>
          <Zip id="4">string</Zip>
        </tnsTypes:Address>
      </soap:Body>
    </soap:Envelope> 
    

См. также

Справочник

SoapDocumentMethodAttribute
SoapRpcMethodAttribute

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

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