Как управлять вложением параметров метода веб-службы в дополнительный элемент
Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation.
Параметры или возвращаемые значения для метода веб-службы можно автоматически инкапсулировать в родительском элементе XML в элементе Body сообщения SOAP либо привязывать их непосредственно к элементам part сообщения в документе WSDL. В .NET Framework эти два способа называются "Wrapped" и "Bare" (соответственно) и управляются с помощью атрибутов.
Указание об инкапсуляции параметров в одном элементе XML
Примените атрибут SoapDocumentMethod к методу в прокси-классе, вызывающему нужный метод веб-службы, присваивающий свойству ParameterStyle значение Wrapped.
В следующем примере кода свойству ParameterStyle задается значение Wrapped. Кроме того, стилю форматирования параметра задается значение Literal.
[SoapDocumentMethod("https://www.contoso.com/DocumentWrappedLiteral", RequestNamespace="https://www.contoso.com", ResponseNamespace="https://www.contoso.com", Use=SoapBindingUse.Literal, ParameterStyle=SoapParameterStyle.Wrapped)] public string DocumentWrappedLiteral(Address1 address, bool useZipPlus4) {
<SoapDocumentMethod("https://www.contoso.com/DocumentWrappedLiteral", _ RequestNamespace:="https://www.contoso.com", _ ResponseNamespace:="https://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="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <DocumentWrappedLiteral xmlns="https://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="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <DocumentWrappedLiteralResponse xmlns="https://www.contoso.com"> <DocumentWrappedLiteralResult>string </DocumentWrappedLiteralResult> </DocumentWrappedLiteralResponse> </soap:Body> </soap:Envelope>
Указание о следовании параметров непосредственно за элементом Body
Примените атрибут SoapDocumentMethod к методу в прокси-классе, вызывающему нужный метод веб-службы, присваивающий свойству ParameterStyle значение Bare.
Следующий пример кода, созданный программой Wsdl.exe, задает свойству ParameterStyle значение Bare, а стилю форматирования параметра — значение Literal. Поскольку пространство имен нельзя указать в элементе, инкапсулирующем все параметры, необходимо указать его отдельно для каждого параметра и возвращаемого значения. Для этого достаточно применить атрибут XmlElementAttribute к каждому параметру и возвращаемому значению и задать свойство Namespace.
[SoapDocumentMethod( "https://www.contoso.com/DocumentBareLiteral", Use=SoapBindingUse.Literal, ParameterStyle=SoapParameterStyle.Bare)] [return: XmlElement(Namespace="https://www.contoso.com", IsNullable=true)] public string DocumentBareLiteral( [XmlElement(Namespace="https://www.contoso.com", IsNullable=true)] Address1 MyAddress, [XmlElement(Namespace="https://www.contoso.com", IsNullable=false)] bool useZipPlus4) {
<SoapDocumentMethod( _ https://www.contoso.com/DocumentBareLiteral", _ Use:=SoapBindingUse.Literal, _ ParameterStyle:= SoapParameterStyle.Bare)> _ Public Function DocumentBareLiteral( _ ByVal <XmlElement([Namespace]:="https://www.contoso.com", _ IsNullable:=true)> _ MyAddress As Address1, _ ByVal <XmlElement([Namespace]:="https://www.contoso.com", _ IsNullable:=false)> _ useZipPlus4 As Boolean) _ As <XmlElement([Namespace]:="https://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="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <MyAddress xmlns="https://www.contoso.com"> <Street>string</Street> <City>string</City> <Zip>string</Zip> </MyAddress> <useZipPlus4 xmlns="https://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="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <DocumentBareLiteralResult xmlns="https://www.contoso.com"> string</DocumentBareLiteralResult> </soap:Body> </soap:Envelope>
См. также
Справочник
SoapDocumentMethodAttribute
SoapRpcMethodAttribute