Publication Date: 2017-06-16

Approval Date: 2017-02-20

Posted Date: 2016-11-03

Reference number of this document: OGC 16-138

Reference URL for this document: http://www.opengis.net/doc/PER/t12-A061

Category: User Guide

Editor: Peter Baumann

Title: Testbed-12 OWS SOAP User Guide


COPYRIGHT

Copyright © 2017 Open Geospatial Consortium. To obtain additional rights of use, visit http://www.opengeospatial.org/

Important

Attention is drawn to the possibility that some of the elements of this document may be the subject of patent rights. The Open Geospatial Consortium shall not be held responsible for identifying any or all such patent rights. Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by any implementation of the standard set forth in this document, and to provide supporting documentation.

Note

This document is a user guide created as a deliverable in an OGC Interoperability Initiative as a user guide to the work of that initiative and is not an official position of the OGC membership. There may be additional valid approaches beyond what is described in this user guide.


POINTS OF CONTACT

Name

Organization

Peter Baumann

Jacobs University

Andreas Matheus

Secure Dimensions

Ziheng Sun

GMU

Sheng Wu

ASU

Jeff Harrison

CarbonCloud


1. Introduction

This OGC Engineering Report provides guidance for using SOAP in the context of OGC Web Services (OWSs). Use is exemplified on three core services, Web Map Service (WMS), Web Feature Service (WFS), and Web Coverage Service (WCS).

We start with a brief overview on SOAP. Another primer is available, e.g., from w3schools.com. A study on the practical use of SOAP has been conducted in [EC-SOAP].

1.1. SOAP Primer

The user guide addresses three parts: The interface or API part, the service part, and the client part. All parts can be looked at separately, but are not isolated from each other. They are all linked (related) to each other by a common description of the service interface using a Web Services Description Language (WSDL). Commonly, a WSDL file defines the SOAP message structure (data types, messages, operations and service endpoints including a binding for the operations) that is mandated by the service and to be sent by the client.

fig1
Figure 1. Relationship between a SOAP enabled (OGC) Web Service, its API, and a client application

It seems to be reasonable to assume that a service side development produces at some stage the API. This can either happen by creating an interoperable description of the API, e.g. using IDL or WSDL. However, the description of an API can also be done via an OGC interface standard. (Note that "API", aka Application Programming Interface, is understood in a very general sense including, beyond direct function invocation, also Web service request protocols etc.) Therefore, the use of e.g. a WSDL must be considered optional but would improve the interoperability via automatic code generation but preventing misinterpretation of the English language. In any case where the API involves security, it is reasonable to request a machine-readable version of the API, aka a WSDL file.

We start with the interface (API), proceed with the service side development and implementation, and finally address client implementation.

1.2. SOAP API

It seems to be reasonable to assume that a service side development produces at some stage the API. This can either happen by creating an interoperable description of the API, e.g. using IDL or WSDL. However, the description of an API can also be done via an OGC implementation standard. Therefore, the use of e.g. a WSDL must be considered optional but would improve the interoperability via automatic code generation but preventing misinterpretation of the English language. In any case where the API involves security, it is reasonable to request a machine-readable version of the API, aka a WSDL file.

fig2
Figure 2. UML-alike presentation of building blocks for a SOAP-based Web Service

As illustrated in the figure above, it is important to understand the overall relationships between all the building blocks that exist in the OGC Web Services world to develop a service and the client involving security. The most important aspect that can be isolated from the figure above is that it reflects the two basic approaches for developing the client application:

  1. The client application development is directly using the service API implementation as defined in the service WSDL. The developer can use a tool to auto-generate the relevant code. For example, a WSDL2Java transformer could have been used. With this approach, the client application does use the service interface as defined in the WSDL.

  2. The client application development is based on some other description of the service API / interface. For example, the client application developer can use the appropriate OGC Web Service specification(s) to implement the code that uses the service interface properly.

Regardless of the approach, it is important to note that the service instance implements the API defined by the WSDL. This does guarantee immediate interoperability for the client type #1 because the auto-generated client stubs fit exactly the service implementation. This is in particular important in cases where a WS-SecurityPolicy is used that declare the security requirements for the SOAP envelope.

It is therefore recommended that for each SOAP enabled OGC Web Service instance, a WSDL is provided that is capable to support the auto-generation of client stubs. At this point it is important to note that the use of a WSDL document is not sufficient by itself; a Capabilities document is still required, as we will illustrate in a later section.

1.3. WSDL

The Web Services Description Language (WSDL) is a W3C standard that allows creating a machine-readable description of a web service instance. In a nutshell, the WSDL separates this description is multiple sections:

  1. The Data Type section supports the definition of simple and complex data structures for the target encoding XML.

  2. The Message section supports the definition of XML encoded messages that are inbound and outbound to the service.

  3. The Operation section relates messages to Operations.

  4. The Binding section associates the operations to a particular binding, e.g. SOAP.

  5. The Service section finally completes the service instance description with providing a network endpoint for the binding(s).

A WSDL instance document excluding the Service section can be seen as a service type specific description of SOAP enabled OGC Web Service. Such a WSDL document can therefore be used to auto-generate a library that includes the capabilities to marshal and unmarshal service type specific message structures, encoded in XML. In order to achieve the auto-generation, it is required that – at the end – all message structures are well defined. This requires in particular, that all data types be based on valid XML Schema.

1.4. Implementation Aspects

It is important to understand that the implementation of a client application for SOAP enabled OGC Web Services requires the Capabilities document and optionally the service. As illustrated above, the implementation of a client application for SOAP enabled OGC Web Services can be described as a step-by-step approach:

  1. Creating the SOAP message library from the WSDL -> SOAP Library

  2. Implementing a service type specific API that instruments the SOAP message creation based on parsing the Capabilities -> Operation Library

  3. Developing the GUI part of the application to reflect user specific requirements

For the creation of the SOAP Library and its programming language specific implementation, different tools exit. For example the Apache CXF WSDL2Java tool is capable to create a complete SOAP message API and all required calls to the network libraries to communicate with the service. In case that a developer intends to create a generic SOAP API, the tools must omit the <Service> definition section of the WSDL. The resulting code is capable to marshal and unmarshal SOAP messages specific for the definitions in the WSDL.

The following Figure 3 illustrates the different layers for a SOAP supporting client including the SOAP library (layer 6) and the Capabilities library (layer 7). With these libraries in place, the client application always communicates with the Capabilities Library, which is a specialization of the generic SOAP library. The overarching basis is the network communication library, which is used by the SOAP library in the case the SOAP library is auto-generated from a service instance WSDL document.

fig3
Figure 3. Software stack for Client Applications supporting SOAP and Security

1.5. References

[EC-SOAP] Matteo Villa, Roberto Lucchi, Michel Millot, Ioannis Kanellopoulos (eds.): SOAP HTTP Binding Status - Survey on OGC and ORCHESTRA specifications relevant for the INSPIRE Network Services. JRC Scientific and Technical Reports, 2008; http://inspire.ec.europa.eu/reports/ImplementingRules/network/SOAP_binding_survey.pdf

2. OGC Web Services over SOAP

In this section, core OGC Web service standards - WCS, WFS, and WMS - are being inspected with respect to their SOAP support.

2.1. Web Coverage Service (WCS) over SOAP

Starting WCS 2, SOAP is supported as a so-called protocol binding [OGC 09-149r1]. The philosophy behind is that protocol binding and encoding is separated from functionality (such as service extensions like range subsetting or CRS transformation) to achieve orthogonality. This allows maximizing use of WCS in diverse environments and setups without compromising interoperability.

In the sequel, we describe how to use SOAP in WCS 2 (note that WCS 1.x is a deprecated old version, incompatible to WCS 2 as per OGC’s version management directives).

2.1.1. WCS-SOAP Definitions

The OGC Web Coverage Service (WCS) supports electronic retrieval of geospatial data as "coverages" – that is, digital geospatial information representing space/time-varying phenomena. The WCS SOAP Extension standard specifies a SOAP protocol binding to the OGC Web Coverage Service (WCS) 2.0 core to allow for client/server communication using SOAP with XML encoding.

Seven requirements describe the use of SOAP for WCS communication:

  • Requirement 1: A WCS service implementing this extension shall include the following URI in the Pro-file element of the ServiceIdentification in a GetCapabilities response: http://www.opengis.net/spec/WCS_protocol-binding_soap/1.0

  • Requirement 2: For those WCSServiceMetadata elements inherited from OWSServiceMetadata, WCS servers shall specify the HTTP POST request encodings accepted by including an ows:Constraint element, with “PostEncoding” as the value of the name attribute and with a value of “SOAP” to indicate that SOAP encoding is allowed.

  • Requirement 3: WCS servers and clients implementing this protocol shall adhere to SOAP 1.2 for all WCS operation requests and responses. The SOAP Request-Response message exchange pattern shall be used with the HTTP POST binding.

  • Requirement 4: Each XML-encoded operation request and response shall consist of one SOAP Envelope containing exactly one Body. In a request, each Body shall contain exactly one WCS request.

  • Requirement 5: A GetCoverage SOAP response shall be encoded as “SOAP with Attachments” as defined in [W3C Note 11], but using SOAP 1.2 rather than SOAP 1.1.

  • Requirement 6: In a GetCoverage response, the SOAP Envelope shall contain one Body element which contains the Coverage as its single element.

  • Requirement 7: When an error is detected while processing an operation request encoded in a SOAP envelope, the WCS server shall generate a SOAP response message where the content of the Body element is a Fault element containing an ows:ExceptionReport element [OGC 06-121r9], with the soap:Value element element having the fixed string “soap:server” and the soap:Text having the fixed string “Server exception was encountered.” (Note : This fixed string is used since the details of the exception shall be specified in the Detail element using an ows:ExceptionReport element as specified in OWS Common [OGC 06-121r9].) Further, there is a requirement describing WCS SOAP bindings, see file wcs-soap-binding.wsdl provided in the wsdl/ subdirectory of the WCS XML schema tree. There is just one requirement on WSDL:

  • Requirement 8: Publication of a WCS SOAP service endpoint shall use the binding as defined in file wsdl/wcs-soap-binding.wsdl of the WCS XML package.

This definition looks as follows:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://www.opengis.net/wcs/2.0"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wcs="http://www.opengis.net/wcs/2.0"
    xmlns:ows="http://www.opengis.net/ows/2.0"
    xmlns:gml="http://www.opengis.net/gml/3.2"
    xmlns:gmlcov="http://www.opengis.net/gmlcov/1.0"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsdl:documentation xmlns:dc="http://purl.org/dc/elements/1.1/">
        <dc:identifier>http://www.opengis.net/def/objectType/OGC-WCS/0/WSDL-Interface</dc:identifier>
        <dc:date>2010-apr-14</dc:date>
        <dc:description>
            This is the normative service interface definition for the SOAP protocol
            binding of the OGC Web Coverage Service v2.0.
            WSDL 1.1 syntax is used to describe interface signatures and message structures.

            The intention is that individual implementations will establish something like
            *-endpoint(s).wsdl files, and will provide (possibly restricted) versions of
            *-binding(s).wsdl files, depending on the interfaces that the implementation on
            hand supports.

            Copyright (c) 2010 Open Geospatial Consortium, Inc. All Rights Reserved.
            To obtain additional rights of use, visit http://www.opengeospatial.org/legal/.
        </dc:description>
    </wsdl:documentation>

    <!-- ============================================================== -->
    <!-- WCS request/response types                                     -->
    <!-- ============================================================== -->
    <wsdl:types>
        <xsd:schema targetNamespace="http://www.opengis.net/wcs/2.0"
            xmlns:wcs="http://www.opengis.net/wcs/2.0"
            elementFormDefault="qualified" version="2.0.1">
            <xsd:include schemaLocation="http://schemas.opengis.net/wcs/2.0/wcsAll.xsd"/>
        </xsd:schema>
    </wsdl:types>

    <!-- ============================================================== -->
    <!-- WCS request messages                                           -->
    <!-- ============================================================== -->
    <wsdl:message name="GetCapabilitiesRequest">
        <wsdl:part name="Body" element="wcs:GetCapabilities"/>
    </wsdl:message>
    <wsdl:message name="DescribeCoverageRequest">
        <wsdl:part name="Body" element="wcs:DescribeCoverage"/>
    </wsdl:message>
    <wsdl:message name="GetCoverageRequest">
        <wsdl:part name="Body" element="wcs:GetCoverage"/>
    </wsdl:message>

    <!-- ============================================================== -->
    <!-- WCS response messages                                          -->
    <!-- ============================================================== -->
    <wsdl:message name="GetCapabilitiesResponse">
        <wsdl:part name="Body" element="wcs:Capabilities"/>
    </wsdl:message>
    <wsdl:message name="DescribeCoverageResponse">
        <wsdl:part name="Body" element="wcs:CoverageDescriptions"/>
    </wsdl:message>
    <wsdl:message name="GetCoverageResponse">
        <wsdl:part name="Body" element="gmlcov:AbstractCoverage"/>
    </wsdl:message>
    <wsdl:message name="ServiceExceptionReport">
        <wsdl:part name="Body" element="ows:ExceptionReport"/>
    </wsdl:message>

    <!-- ============================================================== -->
    <!-- WCS port                                                       -->
    <!-- ============================================================== -->
    <wsdl:portType name="WcsPortType">
        <wsdl:operation name="GetCapabilitiesOperation">
            <wsdl:input message="GetCapabilitiesRequest"/>
            <wsdl:output message="GetCapabilitiesResponse"/>
            <wsdl:fault name="ServiceExceptionReport" message="ServiceExceptionReport"/>
        </wsdl:operation>
        <wsdl:operation name="DescribeCoverageOperation">
            <wsdl:input message="DescribeCoverageTypeRequest"/>
            <wsdl:output message="DescribeCoverageTypeResponse"/>
            <wsdl:fault name="ServiceExceptionReport" message="ServiceExceptionReport"/>
        </wsdl:operation>
        <wsdl:operation name="GetCoverageOperation">
            <wsdl:input message="GetCoverageRequest"/>
            <wsdl:output message="GetCoverageResponse"/>
            <wsdl:fault name="ServiceExceptionReport" message="ServiceExceptionReport"/>
        </wsdl:operation>
    </wsdl:portType>

    <!-- ============================================================== -->
    <!-- WCS binding                                                    -->
    <!-- ============================================================== -->
    <wsdl:binding name="WcsSoapBinding" type="WcsPortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="GetCapabilitiesOperation">
            <soap:operation/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
            <wsdl:fault name="ServiceExceptionReport">
                <soap:fault name="ServiceExceptionReport" use="literal"/>
            </wsdl:fault>
        </wsdl:operation>
        <wsdl:operation name="DescribeCoverageOperation">
            <soap:operation/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
            <wsdl:fault name="ServiceExceptionReport">
                <soap:fault name="ServiceExceptionReport" use="literal"/>
            </wsdl:fault>
        </wsdl:operation>
        <wsdl:operation name="GetCoverageOperation">
            <soap:operation/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
            <wsdl:fault name="ServiceExceptionReport">
                <soap:fault name="ServiceExceptionReport" use="literal"/>
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>

    <!-- ============================================================== -->
    <!-- WCS service                                                    -->
    <!-- ============================================================== -->
    <!-- this section describes the concrete service instance, hence    -->
    <!-- cannot be provided in advance. See example-soap-endpoint.wsdl  -->
    <!-- for an example of setting up a concrete service description.   -->

</wsdl:definitions>

A sample service description relying on this binding is provided in file example-soap-endpoint.wsdl, which is copied below and can be reused (with URLs, service name, etc. adapted):

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
    targetNamespace="http://www.myservice.com/wcs"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
    <wsdl:documentation xmlns:dc="http://purl.org/dc/elements/1.1/">
        <dc:date>2010-apr-14</dc:date>
        <dc:description>
            This WSDL document specifies, by way of an example, the service-specific
            properties of a WCS service based on the generic definitions provided
            with the WCS WSDL specification imported below.

            Copyright (c) 2010 Open Geospatial Consortium, Inc. All Rights Reserved.
            To obtain additional rights of use, visit http://www.opengeospatial.org/legal/.
        </dc:description>
    </wsdl:documentation>

    <wsdl:import namespace="http://www.opengis.net/wcs/wsdl" location="./wcs-soap-binding.wsdl"/>

    <!-- ============================================================== -->
    <!-- sample WCS service, relying on the standard SOAP binding       -->
    <!-- ============================================================== -->
    <!-- adapt this below to your particular service:                   -->

    <wsdl:service name="MyFabulousWCS">
        <wsdl:documentation>
            A WCS 2.0 service instance which implements the WCS SOAP protocol binding extension.
        </wsdl:documentation>
        <wsdl:port name="WcsSoapPort" binding="WcsSoapBinding">
            <soap:address location="http://www.myservice.com/wcs-soap"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

To allow WCS extensions to add further parameters the XML Schema wcs:Request-BaseType contains an optional element <extension> with unbounded cardinality. This way, extensions can add their individual request parameters without (syntactic) interference.

2.1.2. WCS-SOAP in Practice

WCS services offering SOAP support have been stood up in Testbed 12 by Jacobs University and George Mason University. In the sequel, we describe both.

Jacobs University WCS-SOAP
  • WCS GetCoverage request:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
    <env:Header/>
    <env:Body>
        <wcs:GetCoverage xmlns:wcs="http://www.opengis.net/wcs/2.0"
            xmlns:gml="http://www.opengis.net/gml/3.2"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.opengis.net/wcs/2.0 ../../wcsAll.xsd"
            service="WCS" version="2.0.0">
            <wcs:CoverageId>BlueMarbleCov</wcs:CoverageId>
            <wcs:DimensionTrim>
                <wcs:Dimension>Lat</wcs:Dimension>
                <wcs:TrimLow>10</wcs:TrimLow>
                <wcs:TrimHigh>20</wcs:TrimHigh>
            </wcs:DimensionTrim>
            <wcs:DimensionTrim>
                <wcs:Dimension>Long</wcs:Dimension>
                <wcs:TrimLow>10</wcs:TrimLow>
                <wcs:TrimHigh>30</wcs:TrimHigh>
            </wcs:DimensionTrim>
       <gml:format>image/tiff</gml:format>
        </wcs:GetCoverage>
    </env:Body>
</env:Envelope>
  • Response:

figWCS1
GMU SOAP WCS

In this testbed, we tested several options for SOAP WCS to transfer coverages between servers and clients:

Here is a pertaining WSDL file (without Security Policy):

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://wcs.ws.csiss.gmu.edu" xmlns:ns="http://wcs.ws.csiss.gmu.edu" xmlns:impl="http://wcs.ws.csiss.gmu.edu" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:ax21="http://wcs.ws.csiss.gmu.edu/xsd" xmlns:gmlcov="http://www.opengis.net/gmlcov/1.0" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:ows="http://www.opengis.net/ows/2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:intf="http://wcs.ws.csiss.gmu.edu" xmlns:wcs="http://www.opengis.net/wcs/2.0" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/">
<wsdl:documentation>GMU_SOAP_WCS_Service</wsdl:documentation>
  <wsdl:types>
    <xsd:schema elementFormDefault="qualified" targetNamespace="http://wcs.ws.csiss.gmu.edu" xmlns="http://schemas.xmlsoap.org/wsdl/">
        <xsd:import namespace="http://www.opengis.net/wcs/2.0" schemaLocation="GMU_SOAP_WCS_Service?xsd=wcsAll.xsd"/>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="DescribeCoverageRequest">
    <wsdl:part name="BodyElement" element="wcs:DescribeCoverage">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="GetCapabilitiesRequest">
    <wsdl:part name="BodyElement" element="wcs:GetCapabilities">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="GetCapabilitiesResponse">
    <wsdl:part name="BodyElement" element="wcs:Capabilities">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="ServiceExceptionReport">
    <wsdl:part name="BodyElement" element="ows:ExceptionReport">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="GetCoverageRequest">
    <wsdl:part name="BodyElement" element="wcs:GetCoverage">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="DescribeCoverageResponse">
    <wsdl:part name="BodyElement" element="wcs:CoverageDescriptions">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="GetCoverageResponse">
    <wsdl:part name="BodyElement" element="gmlcov:AbstractCoverage">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="WCSPortType">
    <wsdl:operation name="GetCapabilities" parameterOrder="GetCapabilitiesElement">
      <wsdl:input name="GetCapabilitiesRequest" message="ns:GetCapabilitiesRequest">
    </wsdl:input>
      <wsdl:output name="GetCapabilitiesResponse" message="ns:GetCapabilitiesResponse">
    </wsdl:output>
      <wsdl:fault name="ServiceExceptionReport" message="ns:ServiceExceptionReport">
    </wsdl:fault>
    </wsdl:operation>
    <wsdl:operation name="DescribeCoverage" parameterOrder="DescribeCoverageElement">
      <wsdl:input name="DescribeCoverageRequest" message="ns:DescribeCoverageRequest">
    </wsdl:input>
      <wsdl:output name="DescribeCoverageResponse" message="ns:DescribeCoverageResponse">
    </wsdl:output>
      <wsdl:fault name="ServiceExceptionReport" message="ns:ServiceExceptionReport">
    </wsdl:fault>
    </wsdl:operation>
    <wsdl:operation name="GetCoverage" parameterOrder="GetCoverageElement">
      <wsdl:input name="GetCoverageRequest" message="ns:GetCoverageRequest">
    </wsdl:input>
      <wsdl:output name="GetCoverageResponse" message="ns:GetCoverageResponse">
    </wsdl:output>
      <wsdl:fault name="ServiceExceptionReport" message="ns:ServiceExceptionReport">
    </wsdl:fault>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="GMU_SOAP_WCS_ServiceHttpBinding" type="ns:WCSPortType">
    <http:binding verb="POST"/>
    <wsdl:operation name="GetCapabilities">
      <http:operation location="GetCapabilities"/>
      <wsdl:input>
        <mime:content part="BodyElement" type="application/xml"/>
      </wsdl:input>
      <wsdl:output>
        <mime:content part="BodyElement" type="application/xml"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="GetCoverage">
      <http:operation location="GetCoverage"/>
      <wsdl:input>
        <mime:content part="BodyElement" type="application/xml"/>
      </wsdl:input>
      <wsdl:output>
        <mime:content part="BodyElement" type="application/xml"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="DescribeCoverage">
      <http:operation location="DescribeCoverage"/>
      <wsdl:input>
        <mime:content part="BodyElement" type="application/xml"/>
      </wsdl:input>
      <wsdl:output>
        <mime:content part="BodyElement" type="application/xml"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="GMU_SOAP_WCS_ServiceSoap12Binding" type="ns:WCSPortType">
    <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="GetCapabilities">
      <soap12:operation soapAction="urn:GetCapabilities" style="document"/>
      <wsdl:input>
        <soap12:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal"/>
      </wsdl:output>
      <wsdl:fault name="ServiceExceptionReport">
        <soap12:fault use="literal"/>
      </wsdl:fault>
    </wsdl:operation>
    <wsdl:operation name="GetCoverage">
      <soap12:operation soapAction="urn:GetCoverage" style="document"/>
      <wsdl:input>
        <soap12:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal"/>
      </wsdl:output>
      <wsdl:fault name="ServiceExceptionReport">
        <soap12:fault use="literal"/>
      </wsdl:fault>
    </wsdl:operation>
    <wsdl:operation name="DescribeCoverage">
      <soap12:operation soapAction="urn:DescribeCoverage" style="document"/>
      <wsdl:input>
        <soap12:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal"/>
      </wsdl:output>
      <wsdl:fault name="ServiceExceptionReport">
        <soap12:fault use="literal"/>
      </wsdl:fault>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="GMU_SOAP_WCS_ServiceSoap11Binding" type="ns:WCSPortType">
    <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="GetCapabilities">
      <wsdlsoap:operation soapAction="GetCapabilities"/>
      <wsdl:input name="GetCapabilitiesRequest">
        <wsdlsoap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="GetCapabilitiesResponse">
        <wsdlsoap:body use="literal"/>
      </wsdl:output>
      <wsdl:fault name="ServiceExceptionReport">
        <wsdlsoap:fault use="literal"/>
      </wsdl:fault>
    </wsdl:operation>
    <wsdl:operation name="DescribeCoverage">
      <wsdlsoap:operation soapAction="DescribeCoverage"/>
      <wsdl:input name="DescribeCoverageRequest">
        <wsdlsoap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="DescribeCoverageResponse">
        <wsdlsoap:body use="literal"/>
      </wsdl:output>
      <wsdl:fault name="ServiceExceptionReport">
        <wsdlsoap:fault use="literal"/>
      </wsdl:fault>
    </wsdl:operation>
    <wsdl:operation name="GetCoverage">
      <wsdlsoap:operation soapAction="GetCoverage"/>
      <wsdl:input name="GetCoverageRequest">
        <wsdlsoap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="GetCoverageResponse">
        <wsdlsoap:body use="literal"/>
      </wsdl:output>
      <wsdl:fault name="ServiceExceptionReport">
        <wsdlsoap:fault use="literal"/>
      </wsdl:fault>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="GMU_SOAP_WCS_Service">
    <wsdl:port name="GMU_SOAP_WCS_ServiceHttpSoap11Endpoint" binding="ns:GMU_SOAP_WCS_ServiceSoap11Binding">
      <wsdlsoap:address location="http://www3.csiss.gmu.edu/axis2swa/services/GMU_SOAP_WCS_Service.GMU_SOAP_WCS_ServiceHttpSoap11Endpoint/"/>
    </wsdl:port>
    <wsdl:port name="GMU_SOAP_WCS_ServiceHttpEndpoint" binding="ns:GMU_SOAP_WCS_ServiceHttpBinding">
      <http:address location="http://www3.csiss.gmu.edu/axis2swa/services/GMU_SOAP_WCS_Service.GMU_SOAP_WCS_ServiceHttpEndpoint/"/>
    </wsdl:port>
    <wsdl:port name="GMU_SOAP_WCS_ServiceHttpSoap12Endpoint" binding="ns:GMU_SOAP_WCS_ServiceSoap12Binding">
      <soap12:address location="http://www3.csiss.gmu.edu/axis2swa/services/GMU_SOAP_WCS_Service.GMU_SOAP_WCS_ServiceHttpSoap12Endpoint/"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Sample Requests and Responses follow below.

GetCapabilities
  • GetCapabilites, No Security Request:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://www.opengis.net/wcs/2.0" xmlns:ns1="http://www.opengis.net/ows/2.0">
   <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"></soap:Header>
   <soap:Body>
      <ns:GetCapabilities service="WCS" version="2.0.0"></ns:GetCapabilities>
   </soap:Body>
</soap:Envelope>
  • GetCapabilities, WIth WS-Security Request (Policy 1 UTOverTransport):

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://www.opengis.net/wcs/2.0" xmlns:ns1="http://www.opengis.net/ows/2.0">
   <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
      <wsse:Security soap:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
         <wsu:Timestamp wsu:Id="Timestamp-12468716" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsu:Created>2016-05-24T21:01:26.330Z</wsu:Created>
            <wsu:Expires>2016-05-24T21:06:26.330Z</wsu:Expires>
         </wsu:Timestamp>
         <wsse:UsernameToken wsu:Id="UsernameToken-31571602" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:Username>alice</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">bobPW</wsse:Password>
         </wsse:UsernameToken>
      </wsse:Security>
      <wsa:To>http://www3.csiss.gmu.edu/axis2/services/GMU_SOAP_WCS_Service</wsa:To>
      <wsa:MessageID>urn:uuid:AEDBA74A8D1FC94B631214227032877</wsa:MessageID>
      <wsa:Action>urn:get_capabilities</wsa:Action>
   </soap:Header>
   <soap:Body>
      <ns:GetCapabilities service="WCS"/>
   </soap:Body>
</soap:Envelope>
  • GetCapabilities, With WS-Security Request (Policy 2 SignOnly)

<?xml version="1.0" encoding="UTF-16"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
        <wsse:Security soapenv:mustUnderstand="1"
            xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsu:Timestamp wsu:Id="TS-4A7DF7D78156F0E552147190371775641">
                <wsu:Created>2016-08-22T22:08:37.756Z</wsu:Created>
                <wsu:Expires>2016-08-22T22:13:37.756Z</wsu:Expires>
            </wsu:Timestamp>
            <wsse:BinarySecurityToken
                EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"
                ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="X509-4A7DF7D78156F0E552147190371775642">MIICTzCCAbigAwIBAgIESy9O5zANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQGEwJMSzEQMA4GA1UECBMHV2VzdGVybjEQMA4GA1UEBxMHQ29sb21ibzEPMA0GA1UEChMGQXBhY2hlMRAwDgYDVQQLEwdSYW1wYXJ0MRYwFAYDVQQDEw1TYW1wbGUgQ2xpZW50MB4XDTA5MTIyMTEwMzMxMVoXDTM3MDUwNzEwMzMxMVowbDELMAkGA1UEBhMCTEsxEDAOBgNVBAgTB1dlc3Rlcm4xEDAOBgNVBAcTB0NvbG9tYm8xDzANBgNVBAoTBkFwYWNoZTEQMA4GA1UECxMHUmFtcGFydDEWMBQGA1UEAxMNU2FtcGxlIENsaWVudDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAjBQM+kgC0Wm9hk9v4pjLSg5yK0Em2ulyDmODckWv4mZJ8YwJPVgqEIzwRiOnNBH3s+wFCw297zDsnEgDKSQrsPf1smVUOK/slyDPbqZ47Ewcs07nCPfNigncmpbcaluO3bMw9Oqj9VIYjrUHu5xCp2Fe39ZPbwOzLtAmT8b6iucCAwEAATANBgkqhkiG9w0BAQUFAAOBgQAnjPanrVjFVkxnhsj83RJA2tK//v99KpPf3do9VUI2yEgvBZUzH3q2jk3widwEcsJMHgbRr3VTFL7dNVdCYBcI1KiBY9SMa1XZ4RIHmw7gkJt1JTgjKBzfrout2z614KixRf4w7qkDacGxkNspXG/PSlh03Lfm5sb0vzH1aqBl3g==</wsse:BinarySecurityToken>
            <ds:Signature Id="SIG-4A7DF7D78156F0E552147190371775745" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                        <ec:InclusiveNamespaces PrefixList="wsa soapenv" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                    </ds:CanonicalizationMethod>
                    <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
                    <ds:Reference URI="#Id-836346014">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                                <ec:InclusiveNamespaces PrefixList="" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                            </ds:Transform>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                        <ds:DigestValue>LoSbJHeQeieM4qJ1aHT38p473s4=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#TS-4A7DF7D78156F0E552147190371775641">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                                <ec:InclusiveNamespaces
                                    PrefixList="wsse wsa soapenv" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                            </ds:Transform>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                        <ds:DigestValue>bUYTH0aKM5G/oh/tNZcT3O85uPI=</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue>PDiyIPUHUDwO5tsvQWHgJkr4yyx6/5yF5QRPE4QCKvtI3322Ttu59/M3vzshEbAlpJYFgSUNUMTE+LbCZm9YD9BLkB8thRzcY3byAd7Sle71CnDMUAhiSI3CoT8ob28+FE6MaXJloH/mD7RFGXfcLtXdh5ogIbInEhxeqa6qJk8=</ds:SignatureValue>
                <ds:KeyInfo Id="KI-4A7DF7D78156F0E552147190371775643">
                    <wsse:SecurityTokenReference wsu:Id="STR-4A7DF7D78156F0E552147190371775644">
                        <wsse:Reference
                            URI="#X509-4A7DF7D78156F0E552147190371775642" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
                    </wsse:SecurityTokenReference>
                </ds:KeyInfo>
            </ds:Signature>
        </wsse:Security>
        <wsa:To>http://cube.csiss.gmu.edu/axis2secure/services/GMU_SOAP_WCS_Service</wsa:To>
        <wsa:MessageID>urn:uuid:c0f228af-07cd-45ca-8b98-6877aaa33a8f</wsa:MessageID>
        <wsa:Action>urn:get_capabilities</wsa:Action>
    </soapenv:Header>
    <soapenv:Body wsu:Id="Id-836346014" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <ns1:GetCapabilities ns1:service="WCS" xmlns:ns1="http://www.opengis.net/wcs/2.0"/>
    </soapenv:Body>
</soapenv:Envelope>
  • Response (Policy 2):

<verbatim style="padding-left: 30px;"><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
        <wsse:Security soapenv:mustUnderstand="1"
            xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsu:Timestamp wsu:Id="TS-5F3F60E241A2D629F51471903727751136">
                <wsu:Created>2016-08-22T22:08:47.751Z</wsu:Created>
                <wsu:Expires>2016-08-22T22:13:47.751Z</wsu:Expires>
            </wsu:Timestamp>
            <ds:Signature Id="SIG-5F3F60E241A2D629F51471903727752140" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                        <ec:InclusiveNamespaces PrefixList="wsa soapenv" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                    </ds:CanonicalizationMethod>
                    <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
                    <ds:Reference URI="#Id-925604760">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                                <ec:InclusiveNamespaces PrefixList="" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                            </ds:Transform>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                        <ds:DigestValue>fQxncJRZ4WLuRIHLE0bTGboFLHQ=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#TS-5F3F60E241A2D629F51471903727751136">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                                <ec:InclusiveNamespaces
                                    PrefixList="wsse wsa soapenv" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                            </ds:Transform>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                        <ds:DigestValue>dMNFHh2PHnp56cHGTVSNvUFK5pI=</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue>PKf3rRouWBZ1pJ0M7gHD/Il2Xx+M4OBuk57z65NOIfQV6y/EAqIdafibIkpQYsBI367FyDITkPAW/eJromjdm8brK0evWRqfM8RaBjJFbZUNMHSAl9r5fX4vPW638ztlDm2kJKCfrR11AACQNaVg6KxnPp8fdJilAY/9qIAwK1I=</ds:SignatureValue>
                <ds:KeyInfo Id="KI-5F3F60E241A2D629F51471903727752138">
                    <wsse:SecurityTokenReference wsu:Id="STR-5F3F60E241A2D629F51471903727752139">
                        <wsse:KeyIdentifier
                            EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1">aqePjuZzE1lzwMMtquksvNJsbmI=</wsse:KeyIdentifier>
                    </wsse:SecurityTokenReference>
                </ds:KeyInfo>
            </ds:Signature>
        </wsse:Security>
        <wsa:Action>http://wcs.ws.csiss.gmu.edu/WCSPortType/get_capabilitiesResponse</wsa:Action>
        <wsa:RelatesTo>urn:uuid:c0f228af-07cd-45ca-8b98-6877aaa33a8f</wsa:RelatesTo>
   </soapenv:Header>
   <soapenv:Body>
      <wcs:Capabilities version="2.0.0" xsi:schemaLocation="http://www.opengis.net/wcseo/1.0 http://schemas.opengis.net/wcseo/1.0/wcsEOAll.xsd" xmlns:wcs="http://www.opengis.net/wcs/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <ows:ServiceIdentification xmlns:ows="http://www.opengis.net/ows/2.0">
            <ows:Title>GMU CSISS WCS 2.0</ows:Title>
            <ows:Abstract>WCS 2.0 provided by the Center for Spatial Information Science and Systems of George Mason University. During OGC Testbed 12, CSISS is going to provide SOAP WCS.</ows:Abstract>
            <ows:Keywords>
               <ows:Keyword>WCS 2.0</ows:Keyword>
               <ows:Keyword>OGC</ows:Keyword>
               <ows:Keyword>GMU</ows:Keyword>
               <ows:Keyword>CSISS</ows:Keyword>
               <ows:Keyword>OGC Testbed 12</ows:Keyword>
            </ows:Keywords>
            <ows:ServiceType codeSpace="OGC">OGC WCS</ows:ServiceType>
            <ows:ServiceTypeVersion>2.0.0</ows:ServiceTypeVersion>
            <ows:Profile>http://www.opengis.net/spec/WCS_profile_earth-observation/1.0/conf/ap-eo</ows:Profile>
            <ows:Profile>http://www.opengis.net/spec/WCS/2.0/conf/core</ows:Profile>
            <ows:Profile>http://www.opengis.net/spec/WCS_protocol-binding_get-kvp/1.0</ows:Profile>
            <ows:Profile>http://www.opengis.net/spec/WCS_protocol-binding_post-xml/1.0</ows:Profile>
            <ows:Profile>http://www.placeholder.com/EPSG</ows:Profile>
            <ows:Profile>http://www.placeholder.com/IMAGECRS</ows:Profile>
            <ows:Profile>http://www.opengis.net/spec/WCS_coverage-encoding_geotiff/1.0/</ows:Profile>
            <ows:Profile>http://www.placeholder.com/GML_and_GeoTIFF</ows:Profile>
            <ows:Profile>http://www.placeholder.com/SCALING</ows:Profile>
            <ows:Profile>http://www.placeholder.com/INTERPOLATION</ows:Profile>
            <ows:Fees>None</ows:Fees>
            <ows:AccessConstraints>None</ows:AccessConstraints>
         </ows:ServiceIdentification>
         <ows:ServiceProvider xmlns:ows="http://www.opengis.net/ows/2.0">
            <ows:ProviderName>Center for Spatial Information Science and System, George Mason University</ows:ProviderName>
            <ows:ProviderSite xlink:href="http://localhost:8000/ows?" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
            <ows:ServiceContact>
               <ows:IndividualName>Liping Di</ows:IndividualName>
               <ows:PositionName>Professor</ows:PositionName>
               <ows:ContactInfo>
                  <ows:Phone>
                     <ows:Voice>+1-703-933-6114</ows:Voice>
                     <ows:Facsimile>+1-703-993-6127</ows:Facsimile>
                  </ows:Phone>
                  <ows:Address>
                     <ows:DeliveryPoint>4087 University Dr STE 3100</ows:DeliveryPoint>
                     <ows:City>Fairfax</ows:City>
                     <ows:AdministrativeArea>Virginia</ows:AdministrativeArea>
                     <ows:PostalCode>22030</ows:PostalCode>
                     <ows:Country>USA</ows:Country>
                     <ows:ElectronicMailAddress>ldi@gmu.edu</ows:ElectronicMailAddress>
                  </ows:Address>
                  <ows:OnlineResource xlink:href="http://ows9.csiss.gmu.edu/cgi-bin/WCS20-r?" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
                  <ows:HoursOfService>Mon - Fri 9:30 - 17:00 ET</ows:HoursOfService>
                  <ows:ContactInstructions>E-mails are usually answered within 3 working days.</ows:ContactInstructions>
               </ows:ContactInfo>
               <ows:Role>Service provider</ows:Role>
            </ows:ServiceContact>
         </ows:ServiceProvider>
         <ows:OperationsMetadata xmlns:ows="http://www.opengis.net/ows/2.0">
            <ows:Operation name="GetCapabilities">
               <ows:DCP>
                  <ows:HTTP>
                     <ows:Get xlink:href="http://ows9.csiss.gmu.edu/cgi-bin/WCS20-r?" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
                     <ows:POST xlink:href="http://ows9.csiss.gmu.edu/cgi-bin/WCS20-r?" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
                  </ows:HTTP>
               </ows:DCP>
               <ows:Constraint name="PostEncoding">
                  <ows:AllowedValues>
                     <ows:Value>XML</ows:Value>
                     <ows:Value>SOAP</ows:Value>
                  </ows:AllowedValues>
               </ows:Constraint>
            </ows:Operation>
            <ows:Operation name="DescribeCoverage">
               <ows:DCP>
                  <ows:HTTP>
                     <ows:POST xlink:href="http://ows9.csiss.gmu.edu/cgi-bin/WCS20-r?" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
                     <ows:Get xlink:href="http://ows9.csiss.gmu.edu/cgi-bin/WCS20-r?" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
                  </ows:HTTP>
               </ows:DCP>
               <ows:Constraint name="PostEncoding">
                  <ows:AllowedValues>
                     <ows:Value>XML</ows:Value>
                     <ows:Value>SOAP</ows:Value>
                  </ows:AllowedValues>
               </ows:Constraint>
            </ows:Operation>
            <ows:Operation name="GetCoverage">
               <ows:DCP>
                  <ows:HTTP>
                     <ows:POST xlink:href="http://ows9.csiss.gmu.edu/cgi-bin/WCS20-r?" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
                     <ows:Get xlink:href="http://ows9.csiss.gmu.edu/cgi-bin/WCS20-r?" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
                  </ows:HTTP>
               </ows:DCP>
               <ows:Constraint name="PostEncoding">
                  <ows:AllowedValues>
                     <ows:Value>XML</ows:Value>
                     <ows:Value>SOAP</ows:Value>
                  </ows:AllowedValues>
               </ows:Constraint>
            </ows:Operation>
            <ows:Operation name="DescribeEOCoverageSet">
               <ows:DCP>
                  <ows:HTTP>
                     <ows:POST xlink:href="http://ows9.csiss.gmu.edu/cgi-bin/WCS20-r?" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
                     <ows:Get xlink:href="http://ows9.csiss.gmu.edu/cgi-bin/WCS20-r?" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
                  </ows:HTTP>
               </ows:DCP>
               <ows:Constraint name="PostEncoding">
                  <ows:AllowedValues>
                     <ows:Value>XML</ows:Value>
                     <ows:Value>SOAP</ows:Value>
                  </ows:AllowedValues>
               </ows:Constraint>
            </ows:Operation>
         </ows:OperationsMetadata>
         <wcs:ServiceMetadata version="1.0.0"/>
         <wcs:Contents>
            <wcs:CoverageSummary>
               <wcs:CoverageId>GEOTIFF:"/home/zsun/testfiles/data/2010_305_30H.tif":Band</wcs:CoverageId>
               <wcs:CoverageSubtype>RectifiedDataset</wcs:CoverageSubtype>
            </wcs:CoverageSummary>
            <wcs:CoverageSummary>
               <wcs:CoverageId>GEOTIFF:"/home/zsun/testfiles/data/orthoVNIR067_flatfield.tif":Band</wcs:CoverageId>
               <wcs:CoverageSubtype>RectifiedDataset</wcs:CoverageSubtype>
            </wcs:CoverageSummary>
         </wcs:Contents>
      </wcs:Capabilities>
   </soapenv:Body>
</soapenv:Envelope>
DescribeCoverage
  • DescribeCoverage Request:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://www.opengis.net/wcs/2.0">
   <soap:Header/>
   <soap:Body>
      <ns:DescribeCoverage service="WCS" version="2.0.0">
         <ns:CoverageId>GEOTIFF:"/home/zsun/testfiles/data/orthoVNIR067_flatfield.tif":Band</ns:CoverageId>
      </ns:DescribeCoverage>
   </soap:Body>
</soap:Envelope>
  • DescribeCoverage Response

<?xml version="1.0" encoding="UTF-16"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header/>
    <soapenv:Body>
        <wcs:CoverageDescriptions
            xmlns:wcs="http://www.opengis.net/wcs/2.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wcseo/1.0 http://schemas.opengis.net/wcseo/1.0/wcsEOAll.xsd">
            <wcs:CoverageDescription gml:id="orthoVNIR067_flatfield.tif" xmlns:gml="http://www.opengis.net/gml/3.2">
                <gml:boundedBy>
                    <gml:Envelope axisLabels="lon lat" srsDimension="2"
                        srsName="http://www.opengis.net/def/crs/EPSG/0/4326" uomLabels="deg deg">
                        <gml:lowerCorner>-72.3098 18.4808</gml:lowerCorner>
                        <gml:upperCorner>-72.2864 18.4992</gml:upperCorner>
                    </gml:Envelope>
                </gml:boundedBy>
                <wcs:CoverageId>GEOTIFF:"/home/zsun/testfiles/data/orthoVNIR067_flatfield.tif":Band</wcs:CoverageId>
                <wcs:ServiceParameters>
                    <wcs:CoverageSubtype>RectifiedDataset</wcs:CoverageSubtype>
                </wcs:ServiceParameters>
                <gml:domainSet>
                    <gml:RectifiedGrid dimension="2" gml:id="orthoVNIR067_flatfield.tif_grid">
                        <gml:limits>
                            <gml:GridEnvelope>
                                <gml:low>0 0</gml:low>
                                <gml:high>6134 4817</gml:high>
                            </gml:GridEnvelope>
                        </gml:limits>
                        <gml:axisLabels>lon lat</gml:axisLabels>
                        <gml:origin>
                            <gml:Point
                                gml:id="orthoVNIR067_flatfield.tif_grid_origin" srsName="http://www.opengis.net/def/crs/EPSG/0/4326">
                                <gml:pos>-72.3098 18.4992</gml:pos>
                            </gml:Point>
                        </gml:origin>
                        <gml:offsetVector srsName="http://www.opengis.net/def/crs/EPSG/0/4326">3.82239e-06 0.0</gml:offsetVector>
                        <gml:offsetVector srsName="http://www.opengis.net/def/crs/EPSG/0/4326">0.0 -3.82239e-06</gml:offsetVector>
                    </gml:RectifiedGrid>
                </gml:domainSet>
                <gmlcov:rangeType xmlns:gmlcov="http://www.opengis.net/gmlcov/1.0">
                    <swe:DataRecord xmlns:swe="http://www.opengis.net/swe/2.0">
                        <swe:field name="Band_field_1">
                            <swe:Quantity definition="http://www.opengis.net/def/property/OGC/0/m">
                                <swe:description>GEOTIFF, the number 1 filed of Band</swe:description>
                                <swe:nilValues>-9999.9</swe:nilValues>
                                <swe:constraint>
                                    <swe:AllowedValues>
                                    <swe:min>0</swe:min>
                                    <swe:max>255</swe:max>
                                    </swe:AllowedValues>
                                </swe:constraint>
                            </swe:Quantity>
                        </swe:field>
                        <swe:field name="Band_field_2">
                            <swe:Quantity definition="http://www.opengis.net/def/property/OGC/0/m">
                                <swe:description>GEOTIFF, the number 2 filed of Band</swe:description>
                                <swe:nilValues>-9999.9</swe:nilValues>
                                <swe:constraint>
                                    <swe:AllowedValues>
                                    <swe:min>0</swe:min>
                                    <swe:max>255</swe:max>
                                    </swe:AllowedValues>
                                </swe:constraint>
                            </swe:Quantity>
                        </swe:field>
                        <swe:field name="Band_field_3">
                            <swe:Quantity definition="http://www.opengis.net/def/property/OGC/0/m">
                                <swe:description>GEOTIFF, the number 3 filed of Band</swe:description>
                                <swe:nilValues>-9999.9</swe:nilValues>
                                <swe:constraint>
                                    <swe:AllowedValues>
                                    <swe:min>0</swe:min>
                                    <swe:max>255</swe:max>
                                    </swe:AllowedValues>
                                </swe:constraint>
                            </swe:Quantity>
                        </swe:field>
                    </swe:DataRecord>
                </gmlcov:rangeType>
                <gmlcov:metadata xmlns:gmlcov="http://www.opengis.net/gmlcov/1.0">
        unit=m
        </gmlcov:metadata>
            </wcs:CoverageDescription>
        </wcs:CoverageDescriptions>
    </soapenv:Body>
</soapenv:Envelope>
GetCoverage
  • GetCoverage MTOM/SwA

We use the MTOM way to response the coverage from server to client. The suggested response element is gmlcov:AbstractCoverage according to SOAP Extension document of WCS (OGC 09-149 Req 5). However, we didn’t find a feasible and efficient way to convert and inject an image into the frame of the XML-based coverage schema. If there are discussion results about this issue, we’d like to follow and update our service in future.

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://www.opengis.net/wcs/2.0">
   <soap:Header/>
   <soap:Body>
      <ns:GetCoverage service="WCS" version="2.0.0">
         <ns:CoverageId>GEOTIFF:"/home/zsun/testfiles/data/2010_305_30H.tif":Band</ns:CoverageId>
         <ns:format>image/GEOTIFF</ns:format>
      </ns:GetCoverage>
   </soap:Body>
</soap:Envelope>
  • GetCoverage Response MTOM

<?xml version="1.0" encoding="UTF-16"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header/>
    <soapenv:Body>
      <ns13:coverage xmlns:ns13="http://wcs.ws.csiss.gmu.edu">
      [[SUkqAAgAAAAWAAABAwABAAAAvAIAAAEBAwABAAAAWAIAAAIBAwABAAAACAAAAAMBAwABAAAAAQAAAAYBAwABAAAAAwAAABEBBAA3AAAAAgI][SUkqAAgAAAAWAAABAwABAAAAvAIAAAEBAwABAAAAWAIAAAIBAwABAAAACAAAAAMBAwABAAAAAQAAAAYBAwABAAAAAwAAABEBBAA3AAAAAgI]]
      ..skipped..
wQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
      </ns13:coverage>
    </soapenv:Body>
</soapenv:Envelope>
  • GetCoverageResponse SwA:

 HTTP/1.1 200 OK
 Server: Apache-Coyote/1.1
 Content-Type: multipart/related; boundary="MIMEBoundary_010108ae9f6890b08f493128699869d6d0c1d2dc8eeefaa2"; type="application/soap+xml"; start="<0.710108ae9f6890b08f493128699869d6d0c1d2dc8eeefaa2@apache.org>"; action="http://wcs.ws.csiss.gmu.edu/WCSPortType/GetCoverageResponse"
 Transfer-Encoding: chunked
 Date: Thu, 11 Aug 2016 19:20:37 GMT

 2000
 --MIMEBoundary_010108ae9f6890b08f493128699869d6d0c1d2dc8eeefaa2
 Content-Type: application/soap+xml; charset=UTF-8
 Content-Transfer-Encoding: binary
 Content-ID: <0.710108ae9f6890b08f493128699869d6d0c1d2dc8eeefaa2@apache.org>

 <?xml version='1.0' encoding='UTF-8'?>
 <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
 <soapenv:Header/>
 <soapenv:Body>
 <ns9:AbstractCoverage xmlns:ns9="http://www.opengis.net/gmlcov/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns9:AbstractCoverageType">
 <rangeSet xmlns="http://www.opengis.net/gml/3.2">
 <File>
 <rangeParameters owns="false" xmlns:s11="http://www.w3.org/1999/xlink" s11:href="210108ae9f6890b08f493128699869d6d0c1d2dc8eeefaa2@apache.org" s11:role="http://www.opengis.net/spec/WCS_coverage-encoding_geotiff/1.0/" s11:arcrole="fileReference"/>
 <fileStructure>binary</fileStructure>
 <mimeType>image/tiff</mimeType>
 </File>
 </rangeSet>
 </ns9:AbstractCoverage>
 </soapenv:Body>
 </soapenv:Envelope>
 --MIMEBoundary_010108ae9f6890b08f493128699869d6d0c1d2dc8eeefaa2
 Content-Type: application/octet-stream
 Content-Transfer-Encoding: binary
 Content-ID: <210108ae9f6890b08f493128699869d6d0c1d2dc8eeefaa2@apache.org>

 II*[0x0][0x8][0x0][0x0][0x0][0x16][0x0][0x0][0x1][0x3][0x0][0x1][0x0][0x0][0x0][0xbc][0x2][0x0][0x0][0x1][0x1][0x3][0x0][0x1][0x0][0x0][0x0]X[0x2][0x0][0x0][0x2][0x1][0x3][0x0][0x1][0x0][0x0][0x0][0x8][0x0][0x0][0x0][0x3][0x1][0x3][0x0][0x1][0x0][0x0][0x0][0x1][0x0][0x0][0x0][0x6][0x1][0x3][0x0][0x1][0x0][0x0][0x0][0x3][0x0][0x0][0x0][0x11][0x1][0x4][0x0]7[0x0][0x0][0x0][0x2][0x2][0x0][0x0][0x15][0x1][0x3][0x0][0x1][0x0][0x0][0x0][0x1][0x0][0x0][0x0][0x16][0x1][0x3][0x0][0x1][0x0][0x0][0x0][0xb][0x0][0x0][0x0][0x17][0x1][0x4][0x0]7[0x0][0x0][0x0]

 --MIMEBoundary_010108ae9f6890b08f493128699869d6d0c1d2dc8eeefaa2--

 0
  • GeOnAS screenshot after interacting with the SOAP WCS:

figWCS2

2.1.3. Assessment

SOAP is provided as one of several protocol bindings for WCS which are semantically equivalent. They differ, though, in their practical use - for example, GET/KVP in practice is limited to a certain length of a request in bytes whereas XML/POST and SOAP, using POST requests, do not suffer from such limitations.

Hence, a first advantage of SOAP is the unlimited-length message size, which is an asset in particular when it comes to the often high-volume coverages. Further, extra functionality (such as security) can be implemented in HTTP headers, in the SOAP header, or through additional parameters in the body part (which WCS allows).

On the downside, SOAP tends to be less efficient due to the encoding overhead in the XML involved, and there are security issues: Firewalls can hardly inspect the contents of SOAP packages, so the traffic remains largely unmonitored; this is in contrast to, e.g., REST with its largely HTTP-based operation semantics. Just to clarify, this is not an issue of WCS-SOAP, but of SOAP in general, therefore, and applies to all SOAP services. An issue inherited from OWS Common 2.0 is the mix of SOAP versions in OGC Web services. While generally SOAP 1.2 is required, there is an exception (cf. Requirement 5) stating "A GetCoverage SOAP response shall be encoded as “SOAP with Attachments” as defined in [W3C Note 11], but using SOAP 1.2 rather than SOAP 1.1". It is hoped that a forthcoming version of OWS Common will remedy this.

2.1.4. References

This WFS SOAP Server is developed based on Geotools + Spring + CXF software architecture. All the implemented WFS operations are transported by SOAP1.1, SOAP1.2 protocols with/without MTOM (Message Transmission Optimization Mechanism) and WS-Security supporting. WFS SOAP Server implement the GetCapabilities, DescribeFeatureType, and GetFeature operations and commonly used spatial and non-spatial query filters. All these functionalities can be accessed by visiting demonstration website. All the WFS SOAP service endpoints are listed in this web page.

2.1.5. WFS SOAP 1.1 / 1.2

In this testbed, We use the CXF as our Web Service mechanism provider, which is the most popular open source Web Service development framework from Apache. We implement a basic WFS server by using Geotools API and binding all the operations to SOAP 1.1, SOAP 1.2 protocols. All the WFS responses are wrapped into the soap:Body element. All The results show that WFS service can work well with SOAP protocols. The URLs of SOAP 1.1 and 1.2 endpoints are listed below. The WSDL and SOAP Envelope of services are also provided.

SOAP 1.1
<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' >
     <soap:Head></soap:Head>
     <soap:Body>
     ......
     </soap:Body>
</soap:Envelope>
SOAP 1.2
<soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope' >
    <soap:Head></soap:Head>
    <soap:Body>
    ......
    </soap:Body>
</soap:Envelope>
WFS SOAP with MTOM enabled

To encode responses, OGC 07-158 suggests making use of MTOM (SOAP Message Transmission Optimization Mechanism) in combination with XOP (XML-binary Optimized Packaging) to transmit any non-XML data (e.g. plain text, HTML, or binary data). However, all the responses come from WFS server are encoded into GML, XML Schema or XML format, MTOM could be more useful to return the compressed feature collection data in binary format. Both SOAP 1.1 and 1.2 can support MTOM mechanism. The service endpoints, WSDL hyperlinks and a example of feature collection response encoded in MTOM fashion are listed below.

--uuid:fd194263-5921-4468-9012-01456ef001af
Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml"
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"><soap:Body><FeatureCollection xmlns="http://www.opengis.net/wfs/2.0" xmlns:ns2="http://www.opengis.net/fes/2.0" xmlns:ns3="http://www.opengis.net/ows/1.1" xmlns:ns4="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema" numberMatched="1157" numberReturned="3"><boundedBy><gml:Box xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:testbed2="http://gci.asu.edu/testbed12" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" srsName="GCS_WGS_1984"><gml:coordinates>-122.2400717,37.4030294 -122.0102364,37.7753994</gml:coordinates></gml:Box></boundedBy><member><testbed2:railway-point xmlns:testbed2="http://gci.asu.edu/testbed12" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" gml:id="railway-point.1"><testbed2:the_geom><gml:Point>
  <gml:pos>-122.1072412 37.4074107</gml:pos>
</gml:Point>
</testbed2:the_geom><testbed2:gml_id>id7aa3ad08-9f3a-49ab-ae89-76ab9d00c7e8</testbed2:gml_id><testbed2:id>3.0236493E7</testbed2:id><testbed2:timestamp>2013-02-17T23:13:38Z</testbed2:timestamp><testbed2:user>Clorox</testbed2:user><testbed2:uid>119881</testbed2:uid><testbed2:version>5</testbed2:version><testbed2:changeset>15071154</testbed2:changeset><testbed2:railway>station</testbed2:railway><testbed2:ref/><testbed2:type/></testbed2:railway-point></member><member><testbed2:railway-point xmlns:testbed2="http://gci.asu.edu/testbed12" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" gml:id="railway-point.2"><testbed2:the_geom><gml:Point>
  <gml:pos>-122.0102364 37.4030294</gml:pos>
</gml:Point>
</testbed2:the_geom><testbed2:gml_id>id2c70c898-463d-4a9a-b8a8-b56d7dcc7979</testbed2:gml_id><testbed2:id>3.2331544E7</testbed2:id><testbed2:timestamp>2014-02-27T21:51:07Z</testbed2:timestamp><testbed2:user>n76</testbed2:user><testbed2:uid>318696</testbed2:uid><testbed2:version>25</testbed2:version><testbed2:changeset>20817845</testbed2:changeset><testbed2:railway>level_crossing</testbed2:railway><testbed2:ref/><testbed2:type/></testbed2:railway-point></member><member><testbed2:railway-point xmlns:testbed2="http://gci.asu.edu/testbed12" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" gml:id="railway-point.3"><testbed2:the_geom><gml:Point>
  <gml:pos>-122.2400717 37.7753994</gml:pos>
</gml:Point>
</testbed2:the_geom><testbed2:gml_id>id0816a2ff-3c0c-426b-a0a5-4ff04cb8f6c1</testbed2:gml_id><testbed2:id>5.2987956E7</testbed2:id><testbed2:timestamp>2014-04-15T05:44:38Z</testbed2:timestamp><testbed2:user>Nick L</testbed2:user><testbed2:uid>1884370</testbed2:uid><testbed2:version>8</testbed2:version><testbed2:changeset>21702474</testbed2:changeset><testbed2:railway>level_crossing</testbed2:railway><testbed2:ref/><testbed2:type/></testbed2:railway-point></member></FeatureCollection></soap:Body></soap:Envelope>
--uuid:fd194263-5921-4468-9012-01456ef001af--
WFS SOAP security
<soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope' >
    <soap:Header>
    <wsse:Security
        xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'
        xmlns:wsu='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'
        soap:mustUnderstand='1'>
        <wsse:UsernameToken wsu:Id='UsernameToken-a612a4ab-667a-4774-bc49-8c6c5833ebc1'>
            <wsse:Username>%RED%guest%ENDCOLOR%</wsse:Username>
            <wsse:Password Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'>%RED%123456%ENDCOLOR%</wsse:Password>
        </wsse:UsernameToken>
        </wsse:Security>
    </soap:Header>
    <soap:Body>
    ......
    </soap:Body>
</soap:Envelope>
Sample Requests and Responses
  • GetCapabilities

  • No Security Request :

<soap:Envelope  xmlns:soap='http://www.w3.org/2003/05/soap-envelope' >
    <soap:Head></soap:Head>
    <soap:Body>
        <GetCapabilities
            service='WFS'
            xmlns='http://www.opengis.net/wfs/2.0'
            xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
            xsi:schemaLocation='http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd'/>
    </soap:Body>
</soap:Envelope>
  • WIth WS-Security Request:

<soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope' >
    <soap:Header>
        <wsse:Security
            xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'
            xmlns:wsu='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'  soap:mustUnderstand='1'>
            <wsse:UsernameToken wsu:Id='UsernameToken-a612a4ab-667a-4774-bc49-8c6c5833ebc1'>
                <wsse:Username>guest</wsse:Username>
                <wsse:Password Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'>123456</wsse:Password>
            </wsse:UsernameToken>
        </wsse:Security>
    </soap:Header>
    <soap:Body>
        <GetCapabilities
            service='WFS'
            xmlns='http://www.opengis.net/wfs/2.0'
            xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
            xsi:schemaLocation='http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd'/>
    </soap:Body>
</soap:Envelope>
  • Response :

<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
    <soap:Body>
        <WFS_Capabilities
            xmlns="http://www.opengis.net/wfs/2.0"
            xmlns:ns2="http://www.opengis.net/fes/2.0"
            xmlns:ns3="http://www.opengis.net/ows/1.1"
            xmlns:ns4="http://www.w3.org/1999/xlink"
            xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0.0">
            <ns3:ServiceIdentification>
                <ns3:Title>WFS SOAP Server</ns3:Title>
                <ns3:Abstract>This Web Feature Service is established for the testing of OGC Testbed-12 WFS SOAP server project.</ns3:Abstract>
                <ns3:Keywords>
                    <ns3:Keyword>WFS</ns3:Keyword>
                    <ns3:Keyword>SOAP</ns3:Keyword>
                    <ns3:Keyword>OGC Testbed12</ns3:Keyword>
                </ns3:Keywords>
                <ns3:ServiceType>WFS</ns3:ServiceType>
                <ns3:ServiceTypeVersion>2.0.0</ns3:ServiceTypeVersion>
                <ns3:Fees>NONE</ns3:Fees>
                <ns3:AccessConstraints>NONE</ns3:AccessConstraints>
            </ns3:ServiceIdentification>
            <ns3:ServiceProvider>
                <ns3:ProviderName>Arizona State University</ns3:ProviderName>
                <ns3:ServiceContact>
                    <ns3:IndividualName>Wenwen Li</ns3:IndividualName>
                    <ns3:PositionName>Professor</ns3:PositionName>
                    <ns3:ContactInfo>
                        <ns3:Phone>
                            <ns3:Voice></ns3:Voice>
                            <ns3:Facsimile></ns3:Facsimile>
                        </ns3:Phone>
                        <ns3:Address>
                            <ns3:DeliveryPoint>975 S Myrtle Ave</ns3:DeliveryPoint>
                            <ns3:City>Tempe</ns3:City>
                            <ns3:AdministrativeArea>Arizona</ns3:AdministrativeArea>
                            <ns3:PostalCode>85287-5302</ns3:PostalCode>
                            <ns3:Country>US</ns3:Country>
                            <ns3:ElectronicMailAddress>wenwen@asu.edu</ns3:ElectronicMailAddress>
                        </ns3:Address>
                    </ns3:ContactInfo>
                </ns3:ServiceContact>
            </ns3:ServiceProvider>
            <ns3:OperationsMetadata>
                <ns3:Operation name="GetCapabilities">
                    <ns3:DCP>
                        <ns3:HTTP>
                            <ns3:Get ns4:type="simple" ns4:href="http://polar.geodacenter.org/services/ows/wfs/kvp"/>
                            <ns3:Post ns4:type="simple" ns4:href="http://polar.geodacenter.org/services/ows/wfs/kvp"/>
                        </ns3:HTTP>
                    </ns3:DCP>
                    <ns3:Parameter name="AcceptVersions">
                        <ns3:AllowedValues>
                            <ns3:Value>2.0.0</ns3:Value>
                        </ns3:AllowedValues>
                    </ns3:Parameter>
                    <ns3:Parameter name="AcceptFormats">
                        <ns3:AllowedValues>
                            <ns3:Value>text/xml</ns3:Value>
                        </ns3:AllowedValues>
                    </ns3:Parameter>
                    <ns3:Constraint name="PostEncoding">
                        <ns3:AllowedValues>
                            <ns3:Value>XML</ns3:Value>
                            <ns3:Value>SOAP</ns3:Value>
                        </ns3:AllowedValues>
                    </ns3:Constraint>
                </ns3:Operation>
                <ns3:Operation name="DescribeFeatureType">
                    <ns3:DCP>
                        <ns3:HTTP>
                            <ns3:Get ns4:type="simple" ns4:href="http://polar.geodacenter.org/services/ows/wfs/kvp"/>
                            <ns3:Post ns4:type="simple" ns4:href="http://polar.geodacenter.org/services/ows/wfs/kvp"/>
                        </ns3:HTTP>
                    </ns3:DCP>
                    <ns3:Parameter name="AcceptVersions">
                        <ns3:AllowedValues>
                            <ns3:Value>2.0.0</ns3:Value>
                        </ns3:AllowedValues>
                    </ns3:Parameter>
                    <ns3:Parameter name="AcceptFormats">
                        <ns3:AllowedValues>
                            <ns3:Value>text/xml</ns3:Value>
                        </ns3:AllowedValues>
                    </ns3:Parameter>
                    <ns3:Constraint name="PostEncoding">
                        <ns3:AllowedValues>
                            <ns3:Value>XML</ns3:Value>
                            <ns3:Value>SOAP</ns3:Value>
                        </ns3:AllowedValues>
                    </ns3:Constraint>
                </ns3:Operation>
                <ns3:Operation name="GetFeature">
                    <ns3:DCP>
                        <ns3:HTTP>
                            <ns3:Get ns4:type="simple" ns4:href="http://polar.geodacenter.org/services/ows/wfs/kvp"/>
                            <ns3:Post ns4:type="simple" ns4:href="http://polar.geodacenter.org/services/ows/wfs/kvp"/>
                        </ns3:HTTP>
                    </ns3:DCP>
                    <ns3:Parameter name="AcceptVersions">
                        <ns3:AllowedValues>
                            <ns3:Value>2.0.0</ns3:Value>
                        </ns3:AllowedValues>
                    </ns3:Parameter>
                    <ns3:Parameter name="AcceptFormats">
                        <ns3:AllowedValues>
                            <ns3:Value>text/xml</ns3:Value>
                        </ns3:AllowedValues>
                    </ns3:Parameter>
                    <ns3:Constraint name="PostEncoding">
                        <ns3:AllowedValues>
                            <ns3:Value>XML</ns3:Value>
                            <ns3:Value>SOAP</ns3:Value>
                        </ns3:AllowedValues>
                    </ns3:Constraint>
                </ns3:Operation>
            </ns3:OperationsMetadata>
            <FeatureTypeList>
                <FeatureType>
                    <Name
                        xmlns:testbed12="http://polar.geodacenter.org/testbed12">testbed12:landuse
                    </Name>
                    <Title>landuse</Title>
                    <Abstract>shapefile datasource landuse.shp</Abstract>
                    <ns3:Keywords>
                        <ns3:Keyword>vector data,shapefile,landuse</ns3:Keyword>
                    </ns3:Keywords>
                    <DefaultCRS>GCS_WGS_1984</DefaultCRS>
                    <ns3:WGS84BoundingBox>
                        <ns3:LowerCorner>-122.5395632 37.3616258</ns3:LowerCorner>
                        <ns3:UpperCorner>-121.8570476 37.947331</ns3:UpperCorner>
                    </ns3:WGS84BoundingBox>
                </FeatureType>
                <FeatureType>
                    <Name
                        xmlns:testbed12="http://polar.geodacenter.org/testbed12">testbed12:natural
                    </Name>
                    <Title>natural</Title>
                    <Abstract>shapefile datasource natural.shp</Abstract>
                    <ns3:Keywords>
                        <ns3:Keyword>vector data,shapefile,natural</ns3:Keyword>
                    </ns3:Keywords>
                    <DefaultCRS>GCS_WGS_1984</DefaultCRS>
                    <ns3:WGS84BoundingBox>
                        <ns3:LowerCorner>-122.552839 37.3914656</ns3:LowerCorner>
                        <ns3:UpperCorner>-121.8490024 37.9456804</ns3:UpperCorner>
                    </ns3:WGS84BoundingBox>
                </FeatureType>
                <FeatureType>
                    <Name
                        xmlns:testbed12="http://polar.geodacenter.org/testbed12">testbed12:railway-line
                    </Name>
                    <Title>railway-line</Title>
                    <Abstract>shapefile datasource railway-line.shp</Abstract>
                    <ns3:Keywords>
                        <ns3:Keyword>vector data,shapefile,railway-line</ns3:Keyword>
                    </ns3:Keywords>
                    <DefaultCRS>GCS_WGS_1984</DefaultCRS>
                    <ns3:WGS84BoundingBox>
                        <ns3:LowerCorner>-122.5281793 37.3289808</ns3:LowerCorner>
                        <ns3:UpperCorner>-121.8861779 37.9363257</ns3:UpperCorner>
                    </ns3:WGS84BoundingBox>
                </FeatureType>
                <FeatureType>
                    <Name
                        xmlns:testbed12="http://polar.geodacenter.org/testbed12">testbed12:railway-point
                    </Name>
                    <Title>railway-point</Title>
                    <Abstract>shapefile datasource railway-point.shp</Abstract>
                    <ns3:Keywords>
                        <ns3:Keyword>vector data,shapefile,railway-point</ns3:Keyword>
                    </ns3:Keywords>
                    <DefaultCRS>GCS_WGS_1984</DefaultCRS>
                    <ns3:WGS84BoundingBox>
                        <ns3:LowerCorner>-122.5090495 37.3294102</ns3:LowerCorner>
                        <ns3:UpperCorner>-121.8872239 37.9308625</ns3:UpperCorner>
                    </ns3:WGS84BoundingBox>
                </FeatureType>
                <FeatureType>
                    <Name
                        xmlns:testbed12="http://polar.geodacenter.org/testbed12">testbed12:shop
                    </Name>
                    <Title>shop</Title>
                    <Abstract>shapefile datasource shop.shp</Abstract>
                    <ns3:Keywords>
                        <ns3:Keyword>vector data,shapefile,shop</ns3:Keyword>
                    </ns3:Keywords>
                    <DefaultCRS>GCS_WGS_1984</DefaultCRS>
                    <ns3:WGS84BoundingBox>
                        <ns3:LowerCorner>-122.5474611 37.40515</ns3:LowerCorner>
                        <ns3:UpperCorner>-121.9019584 37.9194798</ns3:UpperCorner>
                    </ns3:WGS84BoundingBox>
                </FeatureType>
                <FeatureType>
                    <Name
                        xmlns:testbed12="http://polar.geodacenter.org/testbed12">testbed12:tourism
                    </Name>
                    <Title>tourism</Title>
                    <Abstract>shapefile datasource tourism.shp</Abstract>
                    <ns3:Keywords>
                        <ns3:Keyword>vector data,shapefile,tourism</ns3:Keyword>
                    </ns3:Keywords>
                    <DefaultCRS>GCS_WGS_1984</DefaultCRS>
                    <ns3:WGS84BoundingBox>
                        <ns3:LowerCorner>-122.5524317 37.4054363</ns3:LowerCorner>
                        <ns3:UpperCorner>-121.9049789 37.9201028</ns3:UpperCorner>
                    </ns3:WGS84BoundingBox>
                </FeatureType>
                <FeatureType>
                    <Name
                        xmlns:testbed12="http://polar.geodacenter.org/testbed12">testbed12:waterway
                    </Name>
                    <Title>waterway</Title>
                    <Abstract>shapefile datasource waterway.shp</Abstract>
                    <ns3:Keywords>
                        <ns3:Keyword>vector data,shapefile,waterway</ns3:Keyword>
                    </ns3:Keywords>
                    <DefaultCRS>GCS_WGS_1984</DefaultCRS>
                    <ns3:WGS84BoundingBox>
                        <ns3:LowerCorner>-122.5754909 37.3862364</ns3:LowerCorner>
                        <ns3:UpperCorner>-121.861508 38.0220317</ns3:UpperCorner>
                    </ns3:WGS84BoundingBox>
                </FeatureType>
            </FeatureTypeList>
        </WFS_Capabilities>
    </soap:Body>
</soap:Envelope>
  • DescribeFeatureType

  • Request :

<soap:Envelope  xmlns:soap='http://www.w3.org/2003/05/soap-envelope' >
    <soap:Head></soap:Head>
    <soap:Body>
        <DescribeFeatureType
            service='WFS'
            xmlns='http://www.opengis.net/wfs/2.0'
            xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
            xsi:schemaLocation='http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd' >
            <TypeName>shop</TypeName>
        </DescribeFeatureType>
    </soap:Body>
</soap:Envelope>
  • Response (SOAP Message) :

<soap:Envelope  xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
    <soap:Body>
        <xs:schema
            xmlns="http://www.opengis.net/wfs/2.0"
            xmlns:ns2="http://www.opengis.net/fes/2.0"
            xmlns:ns3="http://www.opengis.net/ows/1.1"
            xmlns:ns4="http://www.w3.org/1999/xlink"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://polar.geodacenter.org/testbed12"
            elementFormDefault="qualified">
            <xs:import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
            <xs:complexType name="shopType">
                <xs:complexContent>
                    <xs:extension  xmlns:gml="http://www.opengis.net/gml/3.2" base="gml:AbstractFeatureType">
                        <xs:sequence>
                            <xs:element type="gml:PointPropertyType" nillable="true" name="the_geom" minOccurs="0" maxOccurs="1"/>
                            <xs:element type="xs:string" nillable="true" name="gml_id" minOccurs="0" maxOccurs="1"/>
                            <xs:element type="xs:double" nillable="true" name="id" minOccurs="0" maxOccurs="1"/>
                            <xs:element type="xs:string" nillable="true" name="timestamp" minOccurs="0" maxOccurs="1"/>
                            <xs:element type="xs:string" nillable="true" name="user" minOccurs="0" maxOccurs="1"/>
                            <xs:element type="xs:long" nillable="true" name="uid" minOccurs="0" maxOccurs="1"/>
                            <xs:element type="xs:long" nillable="true" name="version" minOccurs="0" maxOccurs="1"/>
                            <xs:element type="xs:long" nillable="true" name="changeset" minOccurs="0" maxOccurs="1"/>
                            <xs:element type="xs:string" nillable="true" name="shop" minOccurs="0" maxOccurs="1"/>
                            <xs:element type="xs:string" nillable="true" name="ref" minOccurs="0" maxOccurs="1"/>
                        </xs:sequence>
                    </xs:extension>
                </xs:complexContent>
            </xs:complexType>
            <xs:element
                xmlns:testbed12="http://polar.geodacenter.org/testbed12"
                xmlns:gml="http://www.opengis.net/gml/3.2"
                type="testbed12:shopType"
                substitutionGroup="gml:AbstractFeature"
                name="shop"/>
        </xs:schema>
    </soap:Body>
</soap:Envelope>
  • Response (MTOM Message) :

--uuid:52b846eb-7f47-4e14-a236-76696bcf5f19
Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml"
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"><soap:Body><xs:schema xmlns="http://www.opengis.net/wfs/2.0" xmlns:ns2="http://www.opengis.net/fes/2.0" xmlns:ns3="http://www.opengis.net/ows/1.1" xmlns:ns4="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://polar.geodacenter.org/testbed12" elementFormDefault="qualified"><xs:import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/><xs:complexType name="shopType"><xs:complexContent><xs:extension xmlns:gml="http://www.opengis.net/gml/3.2" base="gml:AbstractFeatureType"><xs:sequence><xs:element type="gml:PointPropertyType" nillable="true" name="the_geom" minOccurs="0" maxOccurs="1"/><xs:element type="xs:string" nillable="true" name="gml_id" minOccurs="0" maxOccurs="1"/><xs:element type="xs:double" nillable="true" name="id" minOccurs="0" maxOccurs="1"/><xs:element type="xs:string" nillable="true" name="timestamp" minOccurs="0" maxOccurs="1"/><xs:element type="xs:string" nillable="true" name="user" minOccurs="0" maxOccurs="1"/><xs:element type="xs:long" nillable="true" name="uid" minOccurs="0" maxOccurs="1"/><xs:element type="xs:long" nillable="true" name="version" minOccurs="0" maxOccurs="1"/><xs:element type="xs:long" nillable="true" name="changeset" minOccurs="0" maxOccurs="1"/><xs:element type="xs:string" nillable="true" name="shop" minOccurs="0" maxOccurs="1"/><xs:element type="xs:string" nillable="true" name="ref" minOccurs="0" maxOccurs="1"/></xs:sequence></xs:extension></xs:complexContent></xs:complexType><xs:element xmlns:testbed12="http://polar.geodacenter.org/testbed12" xmlns:gml="http://www.opengis.net/gml/3.2" type="testbed12:shopType" substitutionGroup="gml:AbstractFeature" name="shop"/></xs:schema></soap:Body></soap:Envelope>
--uuid:52b846eb-7f47-4e14-a236-76696bcf5f19--

About the schema encapsulation problem, which is described in Testbed-11 SOAP Interface Engineering Report: Comparison on the Usage of SOAP Across OGC Web service interfaces, "A WFS provides an instance of XML Schema in response to a DescribeFeatureType operation. As the direct encapsulation of an XML Schema in a SOAP Body may cause several problems, WFS prescribes the usage of a base64 encoding of the schema as part of the soap:Body element". However, there no errors show when we putting the FeatureType 's schema into SOAP envelope without Base64 encoding.

  • GetFeature

  • Request :

<soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope' >
    <soap:Head></soap:Head>
    <soap:Body>
        <wfs:GetFeature
            xmlns:wfs='http://www.opengis.net/wfs/2.0'
            xmlns:fes='http://www.opengis.net/fes/2.0'
            xmlns:gml='http://www.opengis.net/gml/3.2'
            xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
            xsi:schemaLocation='http://schemas.opengis.net/wfs/2.0/wfs.xsd http://schemas.opengis.net/gml/3.2.1/gml.xsd http://schemas.opengis.net/filter/2.0/filterAll.xsd'
            service='WFS'
            version='2.0'
            outputFormat='application/gml+xml; version=3.2'
            count='3' >
            <wfs:Query typeNames='railway-point'></wfs:Query>
        </wfs:GetFeature>
    </soap:Body>
</soap:Envelope>
  • Response (GML 3.2) :

<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
    <soap:Body>
        <FeatureCollection
            xmlns="http://www.opengis.net/wfs/2.0"
            xmlns:ns2="http://www.opengis.net/fes/2.0"
            xmlns:ns3="http://www.opengis.net/ows/1.1"
            xmlns:ns4="http://www.w3.org/1999/xlink"
            xmlns:xs="http://www.w3.org/2001/XMLSchema" numberMatched="1157" numberReturned="3">
            <boundedBy>
                <gml:Box
                    xmlns:gml="http://www.opengis.net/gml/3.2"
                    xmlns:testbed2="http://gci.asu.edu/testbed12"
                    xmlns:wfs="http://www.opengis.net/wfs/2.0"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" srsName="GCS_WGS_1984">
                    <gml:coordinates>-122.2400717,37.4030294 -122.0102364,37.7753994</gml:coordinates>
                </gml:Box>
            </boundedBy>
            <member>
                <testbed2:railway-point
                    xmlns:testbed2="http://gci.asu.edu/testbed12"
                    xmlns:gml="http://www.opengis.net/gml/3.2"
                    xmlns:wfs="http://www.opengis.net/wfs/2.0"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" gml:id="railway-point.1">
                    <testbed2:the_geom>
                        <gml:Point>
                            <gml:pos>-122.1072412 37.4074107</gml:pos>
                        </gml:Point>
                    </testbed2:the_geom>
                    <testbed2:gml_id>id7aa3ad08-9f3a-49ab-ae89-76ab9d00c7e8</testbed2:gml_id>
                    <testbed2:id>3.0236493E7</testbed2:id>
                    <testbed2:timestamp>2013-02-17T23:13:38Z</testbed2:timestamp>
                    <testbed2:user>Clorox</testbed2:user>
                    <testbed2:uid>119881</testbed2:uid>
                    <testbed2:version>5</testbed2:version>
                    <testbed2:changeset>15071154</testbed2:changeset>
                    <testbed2:railway>station</testbed2:railway>
                    <testbed2:ref/>
                    <testbed2:type/>
                </testbed2:railway-point>
            </member>
            <member>
                <testbed2:railway-point
                    xmlns:testbed2="http://gci.asu.edu/testbed12"
                    xmlns:gml="http://www.opengis.net/gml/3.2"
                    xmlns:wfs="http://www.opengis.net/wfs/2.0"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" gml:id="railway-point.2">
                    <testbed2:the_geom>
                        <gml:Point>
                            <gml:pos>-122.0102364 37.4030294</gml:pos>
                        </gml:Point>
                    </testbed2:the_geom>
                    <testbed2:gml_id>id2c70c898-463d-4a9a-b8a8-b56d7dcc7979</testbed2:gml_id>
                    <testbed2:id>3.2331544E7</testbed2:id>
                    <testbed2:timestamp>2014-02-27T21:51:07Z</testbed2:timestamp>
                    <testbed2:user>n76</testbed2:user>
                    <testbed2:uid>318696</testbed2:uid>
                    <testbed2:version>25</testbed2:version>
                    <testbed2:changeset>20817845</testbed2:changeset>
                    <testbed2:railway>level_crossing</testbed2:railway>
                    <testbed2:ref/>
                    <testbed2:type/>
                </testbed2:railway-point>
            </member>
            <member>
                <testbed2:railway-point
                    xmlns:testbed2="http://gci.asu.edu/testbed12"
                    xmlns:gml="http://www.opengis.net/gml/3.2"
                    xmlns:wfs="http://www.opengis.net/wfs/2.0"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" gml:id="railway-point.3">
                    <testbed2:the_geom>
                        <gml:Point>
                            <gml:pos>-122.2400717 37.7753994</gml:pos>
                        </gml:Point>
                    </testbed2:the_geom>
                    <testbed2:gml_id>id0816a2ff-3c0c-426b-a0a5-4ff04cb8f6c1</testbed2:gml_id>
                    <testbed2:id>5.2987956E7</testbed2:id>
                    <testbed2:timestamp>2014-04-15T05:44:38Z</testbed2:timestamp>
                    <testbed2:user>Nick L</testbed2:user>
                    <testbed2:uid>1884370</testbed2:uid>
                    <testbed2:version>8</testbed2:version>
                    <testbed2:changeset>21702474</testbed2:changeset>
                    <testbed2:railway>level_crossing</testbed2:railway>
                    <testbed2:ref/>
                    <testbed2:type/>
                </testbed2:railway-point>
            </member>
        </FeatureCollection>
    </soap:Body>
</soap:Envelope>
  • Response (GML 2.1) :

<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
    <soap:Body>
        <FeatureCollection
            xmlns="http://www.opengis.net/wfs/2.0"
            xmlns:ns2="http://www.opengis.net/fes/2.0"
            xmlns:ns3="http://www.opengis.net/ows/1.1"
            xmlns:ns4="http://www.w3.org/1999/xlink"
            xmlns:xs="http://www.w3.org/2001/XMLSchema" numberMatched="1157" numberReturned="3">
            <boundedBy>
                <gml:Box
                    xmlns:gml="http://schemas.opengis.net/gml/2.1.2"
                    xmlns:testbed2="http://gci.asu.edu/testbed12"
                    xmlns:wfs="http://www.opengis.net/wfs/2.0"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" srsName="GCS_WGS_1984">
                    <gml:coordinates>-122.2400717,37.4030294 -122.0102364,37.7753994</gml:coordinates>
                </gml:Box>
            </boundedBy>
            <member>
                <testbed2:railway-point
                    xmlns:testbed2="http://gci.asu.edu/testbed12"
                    xmlns:gml="http://schemas.opengis.net/gml/2.1.2"
                    xmlns:wfs="http://www.opengis.net/wfs/2.0"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" fid="railway-point.1">
                    <testbed2:the_geom>
                        <gml:Point>
                            <gml:coordinates> -122.1072412,37.4074107 </gml:coordinates>
                        </gml:Point>
                    </testbed2:the_geom>
                    <testbed2:gml_id>id7aa3ad08-9f3a-49ab-ae89-76ab9d00c7e8</testbed2:gml_id>
                    <testbed2:id>3.0236493E7</testbed2:id>
                    <testbed2:timestamp>2013-02-17T23:13:38Z</testbed2:timestamp>
                    <testbed2:user>Clorox</testbed2:user>
                    <testbed2:uid>119881</testbed2:uid>
                    <testbed2:version>5</testbed2:version>
                    <testbed2:changeset>15071154</testbed2:changeset>
                    <testbed2:railway>station</testbed2:railway>
                    <testbed2:ref/>
                    <testbed2:type/>
                </testbed2:railway-point>
            </member>
            <member>
                <testbed2:railway-point
                    xmlns:testbed2="http://gci.asu.edu/testbed12"
                    xmlns:gml="http://schemas.opengis.net/gml/2.1.2"
                    xmlns:wfs="http://www.opengis.net/wfs/2.0"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" fid="railway-point.2">
                    <testbed2:the_geom>
                        <gml:Point>
                            <gml:coordinates>-122.0102364,37.4030294 </gml:coordinates>
                        </gml:Point>
                    </testbed2:the_geom>
                    <testbed2:gml_id>id2c70c898-463d-4a9a-b8a8-b56d7dcc7979</testbed2:gml_id>
                    <testbed2:id>3.2331544E7</testbed2:id>
                    <testbed2:timestamp>2014-02-27T21:51:07Z</testbed2:timestamp>
                    <testbed2:user>n76</testbed2:user>
                    <testbed2:uid>318696</testbed2:uid>
                    <testbed2:version>25</testbed2:version>
                    <testbed2:changeset>20817845</testbed2:changeset>
                    <testbed2:railway>level_crossing</testbed2:railway>
                    <testbed2:ref/>
                    <testbed2:type/>
                </testbed2:railway-point>
            </member>
            <member>
                <testbed2:railway-point
                    xmlns:testbed2="http://gci.asu.edu/testbed12"
                    xmlns:gml="http://schemas.opengis.net/gml/2.1.2"
                    xmlns:wfs="http://www.opengis.net/wfs/2.0"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" fid="railway-point.3">
                    <testbed2:the_geom>
                        <gml:Point>
                            <gml:coordinates>-122.2400717,37.7753994</gml:coordinates>
                        </gml:Point>
                    </testbed2:the_geom>
                    <testbed2:gml_id>id0816a2ff-3c0c-426b-a0a5-4ff04cb8f6c1</testbed2:gml_id>
                    <testbed2:id>5.2987956E7</testbed2:id>
                    <testbed2:timestamp>2014-04-15T05:44:38Z</testbed2:timestamp>
                    <testbed2:user>Nick L</testbed2:user>
                    <testbed2:uid>1884370</testbed2:uid>
                    <testbed2:version>8</testbed2:version>
                    <testbed2:changeset>21702474</testbed2:changeset>
                    <testbed2:railway>level_crossing</testbed2:railway>
                    <testbed2:ref/>
                    <testbed2:type/>
                </testbed2:railway-point>
            </member>
        </FeatureCollection>
    </soap:Body>
</soap:Envelope>
  • GetFeature Filters

  • BBox Filter :

<soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope' >
    <soap:Head></soap:Head>
    <soap:Body>
        <wfs:GetFeature
            xmlns:wfs='http://www.opengis.net/wfs/2.0'
            xmlns:fes='http://www.opengis.net/fes/2.0'
            xmlns:gml='http://www.opengis.net/gml/3.2'
            xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
            xsi:schemaLocation='http://schemas.opengis.net/wfs/2.0/wfs.xsd http://schemas.opengis.net/gml/3.2.1/gml.xsd http://schemas.opengis.net/filter/2.0/filterAll.xsd'
            service='WFS'
            version='2.0'
            outputFormat='application/gml+xml; version=3.2'
            count='3' >
            <wfs:Query typeNames='railway-point'>
                <fes:Filter>
                    <fes:BBOX>
                        <fes:ValueReference>the_geom</fes:ValueReference>
                        <gml:Envelope srsName='http://www.opengis.net/gml/srs/epsg.xml#4326'>
                            <gml:lowerCorner>-122.44294 37.7411</gml:lowerCorner>
                            <gml:upperCorner>-122.40020 37.7983</gml:upperCorner>
                        </gml:Envelope>
                    </fes:BBOX>
                </fes:Filter>
            </wfs:Query>
        </wfs:GetFeature>
    </soap:Body>
</soap:Envelope>
  • Intersect Filter

<soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope' >
    <soap:Head></soap:Head>
    <soap:Body>
        <wfs:GetFeature
            xmlns:wfs='http://www.opengis.net/wfs/2.0'
            xmlns:fes='http://www.opengis.net/fes/2.0'
            xmlns:gml='http://www.opengis.net/gml/3.2'
            xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
            xsi:schemaLocation='http://schemas.opengis.net/wfs/2.0/wfs.xsd http://schemas.opengis.net/gml/3.2.1/gml.xsd http://schemas.opengis.net/filter/2.0/filterAll.xsd'
            service='WFS' version='2.0' outputFormat='application/gml+xml; version=3.2' count='3' >
            <wfs:Query typeNames='railway-point'>
                <fes:Filter>
                    <fes:Intersects>
                        <fes:ValueReference>the_geom</fes:ValueReference>
                        <gml:Polygon srsName='http://www.opengis.net/def/crs/epsg/0/4326'>
                            <gml:exterior>
                                <gml:LinearRing>
                                    <gml:posList dimension='2'>-122.44294 37.7411 -122.44294 37.7983 -122.40020 37.7983 -122.40020 37.7411 -122.44294 37.7411</gml:posList>
                                </gml:LinearRing>
                            </gml:exterior>
                        </gml:Polygon>
                    </fes:Intersects>
                </fes:Filter>
            </wfs:Query>
        </wfs:GetFeature>
    </soap:Body>
</soap:Envelope>
  • Between Filter :

<soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope' >
    <soap:Head></soap:Head>
    <soap:Body>
        <wfs:GetFeature
            xmlns:wfs='http://www.opengis.net/wfs/2.0'
            xmlns:fes='http://www.opengis.net/fes/2.0'
            xmlns:gml='http://www.opengis.net/gml/3.2'
            xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
            xsi:schemaLocation='http://schemas.opengis.net/wfs/2.0/wfs.xsd http://schemas.opengis.net/gml/3.2.1/gml.xsd http://schemas.opengis.net/filter/2.0/filterAll.xsd'
            service='WFS' version='2.0' outputFormat='application/gml+xml; version=3.2' count='3' >
            <wfs:Query typeNames='railway-point'>
                <fes:Filter>
                    <fes:PropertyIsBetween>
                        <fes:ValueReference>version</fes:ValueReference>
                        <fes:LowerBoundary>
                            <fes:Literal>5</fes:Literal>
                        </fes:LowerBoundary>
                        <fes:UpperBoundary>
                            <fes:Literal>10</fes:Literal>
                        </fes:UpperBoundary>
                    </fes:PropertyIsBetween>
                </fes:Filter>
            </wfs:Query>
        </wfs:GetFeature>
    </soap:Body>
</soap:Envelope>
  • Equal Filter :

<soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope' >
    <soap:Head></soap:Head>
    <soap:Body>
        <wfs:GetFeature
            xmlns:wfs='http://www.opengis.net/wfs/2.0'
            xmlns:fes='http://www.opengis.net/fes/2.0'
            xmlns:gml='http://www.opengis.net/gml/3.2'
            xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
            xsi:schemaLocation='http://schemas.opengis.net/wfs/2.0/wfs.xsd http://schemas.opengis.net/gml/3.2.1/gml.xsd http://schemas.opengis.net/filter/2.0/filterAll.xsd'
            service='WFS' version='2.0' outputFormat='application/gml+xml; version=3.2' count='3' >
            <wfs:Query typeNames='railway-point'>
                <fes:Filter>
                    <fes:PropertyIsEqualTo  matchCase='true'>
                        <fes:ValueReference>version</fes:ValueReference>
                        <fes:Literal>5</fes:Literal>
                    </fes:PropertyIsEqualTo>
                </fes:Filter>
            </wfs:Query>
        </wfs:GetFeature>
    </soap:Body>
</soap:Envelope>

2.2. Web Map Service (WMS) over SOAP

In Testbed 12, The Carbon Project developed, deployed and tested a SOAP WMS.The Testbed 12 architectureconsistsof aserver-sideproxyandaclient-sideproxy. The client-sideproxyreceivesservicerequestsandtransforms them intoaSOAPprotocol.Theserver-sideproxyreceivestheseSOAPrequestsand restores the initialrequest.All requestsusedSOAP 1.2.

The proxy architecture is sketched below:

proxyarchitecture

The essence of a SOAP WMS is passing objects around, and using XML as the transport protocol – in this case to retrieve OGC web maps and OGC service descriptions.For example, the developed SOAP WMS sends a GetCapabilities request to the back-end WMS server and receives the raw capabilities document from the WMS. It then de-serializes it into an object, which is returned by the service. The WSDL describes the object that is returned, with the expectation that the calling application intends to construct an object on its end from the data being sent.

2.2.1. Background

In the past, the OGC primarily specified and standardized services with HTTP-GET and POST bindings. Eventually, a change towards supporting SOAP bindings was performed, but this change only applies to new service specifications, and even those may still define HTTP-GET and -POST bindings.

This led to a situation that HTTP-GET/POST and SOAP bindings existed in parallel. One possible solution was to transform those external standards to HTTP-GET and POST, what would mean a lot of effort to do so and would lead to incompatibility with non-OGC services.

Another way to support HTTP-GET and -POST-based services was to define an approach to provide these services with a SOAP binding, which would enable a transformation of any HTTP-GET and -POST services to a SOAP service. Such a generic approach would even allow to build generic wrapper components which could be applied to any existing HTTP-GET and -POST service.

2.2.2. References

[1] SOAP Version 1.2 Part 1: Messaging Framework, W3C Recommendation 24 June 2003, http://www.w3.org/TR/2003/REC-soap12-part1-20030624/

[2] SOAP 1.2 Attachment Feature, W3C Working Group Note 8 June 2004, http://www.w3.org/TR/2004/NOTE-soap12-af-20040608/

[3] SOAP Message Transmission Optimization Mechanism, W3C Recommendation 25 January 2005, http://www.w3.org/TR/2005/REC-soap12-mtom-20050125/

[4] XML-binary Optimized Packaging, W3C Recommendation 25 January 2005, http://www.w3.org/TR/2005/REC-xop10-20050125/

[5] Web Services Description Language (WSDL) 1.1, W3C Note 15 March 2001, http://www.w3.org/TR/2001/NOTE-wsdl-20010315

[6] Wrapping OGC HTTP-GET and -POST Services with SOAP - Discussion Paper, OGC 07-158,

2.2.3. Sample Request

Here is a sample SOAP WMS raw request as shown by Fiddler (a free web debugging tool which logs HTTP(S) traffic between s computer and the Internet):

POST http://52.7.88.185/WMSSOAP/Wms130.svc HTTP/1.1
Content-Type: text/xml; charset=utf-8
VsDebuggerCausalityData: uIDPo9UPyIMGd/5OubxOnMnCbkEAAAAAbD9eQ39QnkajlSIV50h1Tyt5T6oovWpFqvulEyHK3YgACQAA
SOAPAction: "http://schemas.opengis.net/wms/soap/IWms/GetMap"
Host: 52.7.88.185
Content-Length: 1036
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Wrapper
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
 <GetMap xmlns="http://schemas.opengis.net/wms/soap">
 <layers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
 <a:string>tb12:california</a:string>
 </layers>
 <styles xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>
 <bounds xmlns:a="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP.v1_3_0" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
 <a:cRSField i:nil="true"/>
 <a:maxxField>42.0099638729344</a:maxxField>
 <a:maxyField>-114.126494427975</a:maxyField>
 <a:minxField>32.5194278175397</a:minxField>
 <a:minyField>-124.409975156428</a:minyField>
 <a:resxField>0</a:resxField>
 <a:resxFieldSpecified>false</a:resxFieldSpecified>
 <a:resyField>0</a:resyField>
 <a:resyFieldSpecified>false</a:resyFieldSpecified>
 </bounds>
 <width>337</width>
 <height>237</height>
 <crs>EPSG:4326</crs>
 <format>image/png</format>
 </GetMap>
 </s:Body>
</s:Envelope>

2.2.4. Sample Application Clients

During Testbed 12 a variety of data was deployed on the developed SOAP WMS to support Technology Integration Experiments (TIEs), including NGA NAS GML. NSG Application Schema (NSA) is a Platform Independent Model that defines the GEOINT exchange semantics for the National System for Geospatial-Intelligence (NSG).

Examples of NGA NAS GML deployed via SOAP WMS are shown below in a simple test client, WMS SOAP Tester, developed by The Carbon Project.

WMS SOAP Tester1
wmssoaptester2

In addition to the WMS SOAP Tester client developed by The Carbon Project, the WMS SOAP was successfully accessed by multiple other applications including the Compusult client shown below.

wmssoapcompusult

In the clients above map requests are returned as an image in a SOAP response. The SOAP specifications require that transport occur using XML contained in a SOAP envelope, so the image must be wrapped or it’s not SOAP.

2.2.5. Development

The SOAP WMS application was developed in C# as a Microsoft .Net Windows Communication Foundation (WCF) web service.

2.2.6. Dependencies

  1. Microsoft .Net Framework 4.5.2

  2. Microsoft Windows Server 2012 or later

  3. Microsoft Internet Information Services (IIS) version 8.0 or later

  4. Windows Communication Foundation (included with .Net Framework)

  5. External WMS Server

Deployment
  1. Build source code using Microsoft Visual Studio 2015

  2. Using Visual Studio 2015, publish project to file system

  3. Edit project web.config file to point to external WMS server

    1. Add or edit a setting called “baseUrl” to the appSettings section

    2. Setting value should point to the OWS URL of the external WMS server. Example: http://localhost/geoserver/ows?

  4. Zip the published file system and copy the zip file to the target server

  5. Unzip file into a subdirectory under the IIS server root.

  6. Configure subdirectory as an IIS application

    1. Set application to use a .Net 4.0 integrated application pool. The application pool can shared with other applications or dedicated to the WMS SOAP application.

  7. Restart the IIS web site. (Optional)

Notes

  1. The current version of the application has only been tested with GeoServer 2.8.3. Any valid WMS implementation should be appropriate.

  2. The current version of the application has been developed with the WMS server deployed on the same machine as IIS. The WMS server can be deployed on a separate server, as long as the baseUrl setting in the web.config is updated accordingly.

Examples

The following section provides examples of :

  • SOAP WMS Request with SLD using POSTmap and Named Style

  • SOAP WMS Request with SLD using POSTmap and User Style

  • SOAP WMS WSDL Document

Example 1: SOAP WMS Request with SLD using POSTmap and Named Style

<soapenv:Envelope xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap=" http://schemas.opengis.net/wms/soap">
 <soapenv:Header/>
 <soapenv:Body>

 <soap:PostMapRaw>
 <!--Optional:-->
 <soap:getMapSld>
<oc:GetMap xmlns:oc=" http://www.opengis.net/ows"
 xmlns:gml=" http://www.opengis.net/gml"
 version="1.1.1" service="WMS">
 <StyledLayerDescriptor version="1.0.0">
 <NamedLayer>
 <Name>tb12:california</Name>
 <NamedStyle><Name>polygon</Name></NamedStyle>
 </NamedLayer>
 </StyledLayerDescriptor>
 <BoundingBox srsName=" http://www.opengis.net/gml/srs/epsg.xml#4326">
 <gml:coord><gml:X>-130</gml:X><gml:Y>24</gml:Y></gml:coord>
 <gml:coord><gml:X>-55</gml:X><gml:Y>50</gml:Y></gml:coord>
 </BoundingBox>
 <Output>
 <Format>image/png</Format>
 <Size><Width>550</Width><Height>250</Height></Size>
 </Output>
</oc:GetMap>
 </soap:getMapSld>
 </soap:PostMapRaw>
 </soapenv:Body>
</soapenv:Envelope>

Example 2: SOAP WMS Request with SLD using POSTmap and User Style

<soapenv:Envelope xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap=" http://schemas.opengis.net/wms/soap">
 <soapenv:Header/>
 <soapenv:Body>
 <soap:PostMapRaw>
 <!--Optional:-->
 <soap:getMapSld>
<oc:GetMap xmlns:oc=" http://www.opengis.net/ows"
 xmlns:gml=" http://www.opengis.net/gml"
 version="1.1.1" service="WMS">
 <StyledLayerDescriptor version="1.0.0">
 <NamedLayer>
 <Name>sf:archsites</Name>
 <UserStyle>
 <Title>GeoServer SLD Cook Book: Simple point</Title>
 <FeatureTypeStyle>
 <Rule>
 <PointSymbolizer>
 <Graphic>
 <Mark>
 <WellKnownName>circle</WellKnownName>
 <Fill>
 <CssParameter name="fill">#FF0000</CssParameter>
 </Fill>
 </Mark>
 <Size>6</Size>
 </Graphic>
 </PointSymbolizer>
 </Rule>
 </FeatureTypeStyle>
 </UserStyle> </NamedLayer>
 </StyledLayerDescriptor>
 <BoundingBox srsName=" http://www.opengis.net/gml/srs/epsg.xml#4326">
 <gml:coord><gml:X>-130</gml:X><gml:Y>24</gml:Y></gml:coord>
 <gml:coord><gml:X>-55</gml:X><gml:Y>50</gml:Y></gml:coord>
 </BoundingBox>
 <Output>
 <Format>image/png</Format>
 <Size><Width>550</Width><Height>250</Height></Size>
 </Output>
</oc:GetMap>
 </soap:getMapSld>
 </soap:PostMapRaw>
 </soapenv:Body>
</soapenv:Envelope>

Example 3: SOAP WMS WSDL

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://schemas.opengis.net/wms/soap" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Wms130" targetNamespace="http://schemas.opengis.net/wms/soap">
 <wsdl:types>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/">
 <xs:element name="anyType" nillable="true" type="xs:anyType" />
 <xs:element name="anyURI" nillable="true" type="xs:anyURI" />
 <xs:element name="base64Binary" nillable="true" type="xs:base64Binary" />
 <xs:element name="boolean" nillable="true" type="xs:boolean" />
  <xs:element name="byte" nillable="true" type="xs:byte" />
 <xs:element name="dateTime" nillable="true" type="xs:dateTime" />
 <xs:element name="decimal" nillable="true" type="xs:decimal" />
 <xs:element name="double" nillable="true" type="xs:double" />
 <xs:element name="float" nillable="true" type="xs:float" />
 <xs:element name="int" nillable="true" type="xs:int" />
 <xs:element name="long" nillable="true" type="xs:long" />
 <xs:element name="QName" nillable="true" type="xs:QName" />
 <xs:element name="short" nillable="true" type="xs:short" />
 <xs:element name="string" nillable="true" type="xs:string" />
 <xs:element name="unsignedByte" nillable="true" type="xs:unsignedByte" />
 <xs:element name="unsignedInt" nillable="true" type="xs:unsignedInt" />
 <xs:element name="unsignedLong" nillable="true" type="xs:unsignedLong" />
 <xs:element name="unsignedShort" nillable="true" type="xs:unsignedShort" />
 <xs:element name="char" nillable="true" type="tns:char" />
 <xs:simpleType name="char">
 <xs:restriction base="xs:int" />
 </xs:simpleType>
 <xs:element name="duration" nillable="true" type="tns:duration" />
 <xs:simpleType name="duration">
 <xs:restriction base="xs:duration">
 <xs:pattern value="\-?P(\d*D)?(T(\d*H)?(\d*M)?(\d*(\.\d*)?S)?)?" />
  <xs:minInclusive value="-P10675199DT2H48M5.4775808S" />
 <xs:maxInclusive value="P10675199DT2H48M5.4775807S" />
 </xs:restriction>
 </xs:simpleType>
 <xs:element name="guid" nillable="true" type="tns:guid" />
 <xs:simpleType name="guid">
 <xs:restriction base="xs:string">
 <xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}" />
 </xs:restriction>
 </xs:simpleType>
  <xs:attribute name="FactoryType" type="xs:QName" />
 <xs:attribute name="Id" type="xs:ID" />
 <xs:attribute name="Ref" type="xs:IDREF" />
 </xs:schema>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP.SLD" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP.SLD">
 <xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
  <xs:complexType name="NamedLayer">
 <xs:sequence>
 <xs:element minOccurs="0" name="Description" nillable="true" type="tns:DescriptionType" />
 <xs:element xmlns:q1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" minOccurs="0" name="Items" nillable="true" type="q1:ArrayOfanyType" />
 <xs:element minOccurs="0" name="LayerFeatureConstraints" nillable="true" type="tns:ArrayOfFeatureTypeConstraint" />
 <xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="NamedLayer" nillable="true" type="tns:NamedLayer" />
 <xs:complexType name="DescriptionType">
 <xs:sequence>
 <xs:element name="_abstract" nillable="true" type="xs:string" />
 <xs:element name="_title" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="DescriptionType" nillable="true" type="tns:DescriptionType" />
 <xs:complexType name="ArrayOfFeatureTypeConstraint">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="FeatureTypeConstraint" nillable="true" type="tns:FeatureTypeConstraint" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfFeatureTypeConstraint" nillable="true" type="tns:ArrayOfFeatureTypeConstraint" />
 <xs:complexType name="FeatureTypeConstraint">
 <xs:sequence>
 <xs:element name="_extent" nillable="true" type="tns:ArrayOfExtent" />
 <xs:element name="_featureTypeName" nillable="true" type="xs:QName" />
 <xs:element name="_filter" nillable="true" type="tns:FilterType" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="FeatureTypeConstraint" nillable="true" type="tns:FeatureTypeConstraint" />
 <xs:complexType name="ArrayOfExtent">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="Extent" nillable="true" type="tns:Extent" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfExtent" nillable="true" type="tns:ArrayOfExtent" />
 <xs:complexType name="Extent">
 <xs:sequence>
 <xs:element name="_name" nillable="true" type="xs:string" />
 <xs:element name="_value" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="Extent" nillable="true" type="tns:Extent" />
 <xs:complexType name="FilterType">
 <xs:sequence>
  <xs:element xmlns:q2="http://schemas.microsoft.com/2003/10/Serialization/Arrays" name="_items" nillable="true" type="q2:ArrayOfanyType" />
 <xs:element name="_itemsElementName" nillable="true" type="tns:ArrayOfItemsChoiceType16" />
  </xs:sequence>
 </xs:complexType>
 <xs:element name="FilterType" nillable="true" type="tns:FilterType" />
 <xs:complexType name="ArrayOfItemsChoiceType16">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="ItemsChoiceType16" type="tns:ItemsChoiceType16" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfItemsChoiceType16" nillable="true" type="tns:ArrayOfItemsChoiceType16" />
 <xs:simpleType name="ItemsChoiceType16">
 <xs:restriction base="xs:string">
 <xs:enumeration value="And" />
 <xs:enumeration value="BBOX" />
 <xs:enumeration value="Beyond" />
 <xs:enumeration value="Contains" />
 <xs:enumeration value="Crosses" />
 <xs:enumeration value="DWithin" />
 <xs:enumeration value="Disjoint" />
 <xs:enumeration value="Equals" />
 <xs:enumeration value="FeatureId" />
 <xs:enumeration value="GmlObjectId" />
 <xs:enumeration value="Intersects" />
 <xs:enumeration value="Not" />
 <xs:enumeration value="Or" />
  <xs:enumeration value="Overlaps" />
 <xs:enumeration value="PropertyIsBetween" />
 <xs:enumeration value="PropertyIsEqualTo" />
 <xs:enumeration value="PropertyIsGreaterThan" />
 <xs:enumeration value="PropertyIsGreaterThanOrEqualTo" />
 <xs:enumeration value="PropertyIsLessThan" />
 <xs:enumeration value="PropertyIsLessThanOrEqualTo" />
 <xs:enumeration value="PropertyIsLike" />
 <xs:enumeration value="PropertyIsNotEqualTo" />
 <xs:enumeration value="PropertyIsNull" />
 <xs:enumeration value="Touches" />
 <xs:enumeration value="Within" />
 <xs:enumeration value="_Id" />
  <xs:enumeration value="comparisonOps" />
 <xs:enumeration value="logicOps" />
 <xs:enumeration value="spatialOps" />
 </xs:restriction>
 </xs:simpleType>
 <xs:element name="ItemsChoiceType16" nillable="true" type="tns:ItemsChoiceType16" />
 <xs:complexType name="UserLayer">
 <xs:sequence>
 <xs:element name="_description" nillable="true" type="tns:DescriptionType" />
 <xs:element name="_item" nillable="true" type="xs:anyType" />
 <xs:element name="_item1" nillable="true" type="xs:anyType" />
 <xs:element name="_name" nillable="true" type="xs:string" />
 <xs:element name="_userStyle" nillable="true" type="tns:ArrayOfUserStyle" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="UserLayer" nillable="true" type="tns:UserLayer" />
 <xs:complexType name="ArrayOfUserStyle">
  <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="UserStyle" nillable="true" type="tns:UserStyle" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfUserStyle" nillable="true" type="tns:ArrayOfUserStyle" />
 <xs:complexType name="UserStyle">
 <xs:sequence>
 <xs:element name="_description" nillable="true" type="tns:DescriptionType" />
 <xs:element name="_isDefault" type="xs:boolean" />
 <xs:element xmlns:q3="http://schemas.microsoft.com/2003/10/Serialization/Arrays" name="_items" nillable="true" type="q3:ArrayOfanyType" />
 <xs:element name="_name" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="UserStyle" nillable="true" type="tns:UserStyle" />
 <xs:complexType name="NamedStyle">
 <xs:sequence>
 <xs:element name="_description" nillable="true" type="tns:DescriptionType" />
 <xs:element name="_name" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="NamedStyle" nillable="true" type="tns:NamedStyle" />
 <xs:complexType name="EnvelopeType">
 <xs:sequence>
 <xs:element xmlns:q4="http://schemas.microsoft.com/2003/10/Serialization/Arrays" minOccurs="0" name="Items" nillable="true" type="q4:ArrayOfanyType" />
 <xs:element minOccurs="0" name="ItemsElementName" nillable="true" type="tns:ArrayOfItemsChoiceType" />
 <xs:element minOccurs="0" name="srsDimension" nillable="true" type="xs:string" />
 <xs:element minOccurs="0" name="srsName" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="EnvelopeType" nillable="true" type="tns:EnvelopeType" />
 <xs:complexType name="ArrayOfItemsChoiceType">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="ItemsChoiceType" type="tns:ItemsChoiceType" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfItemsChoiceType" nillable="true" type="tns:ArrayOfItemsChoiceType" />
 <xs:simpleType name="ItemsChoiceType">
 <xs:restriction base="xs:string">
 <xs:enumeration value="coord" />
 <xs:enumeration value="coordinates" />
 <xs:enumeration value="lowerCorner" />
 <xs:enumeration value="pos" />
 <xs:enumeration value="upperCorner" />
 </xs:restriction>
 </xs:simpleType>
 <xs:element name="ItemsChoiceType" nillable="true" type="tns:ItemsChoiceType" />
 <xs:simpleType name="ItemChoiceType">
 <xs:restriction base="xs:string">
 <xs:enumeration value="conversionToPreferredUnit" />
 <xs:enumeration value="roughConversionToPreferredUnit" />
 </xs:restriction>
 </xs:simpleType>
 <xs:element name="ItemChoiceType" nillable="true" type="tns:ItemChoiceType" />
 <xs:simpleType name="VersionType">
 <xs:restriction base="xs:string">
 <xs:enumeration value="Version130" />
 <xs:enumeration value="Version111" />
 <xs:enumeration value="Version110" />
 <xs:enumeration value="Version100" />
 </xs:restriction>
 </xs:simpleType>
 <xs:element name="VersionType" nillable="true" type="tns:VersionType" />
 <xs:complexType name="OutputType">
 <xs:sequence>
 <xs:element minOccurs="0" name="BGcolor" nillable="true" type="xs:string" />
  <xs:element minOccurs="0" name="Format" nillable="true" type="xs:string" />
 <xs:element minOccurs="0" name="Size" nillable="true" type="tns:OutputTypeSize" />
 <xs:element minOccurs="0" name="Transparent" type="xs:boolean" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="OutputType" nillable="true" type="tns:OutputType" />
 <xs:complexType name="OutputTypeSize">
 <xs:sequence>
 <xs:element minOccurs="0" name="Height" nillable="true" type="xs:string" />
 <xs:element minOccurs="0" name="Width" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="OutputTypeSize" nillable="true" type="tns:OutputTypeSize" />
 <xs:complexType name="CoordType">
 <xs:sequence>
 <xs:element minOccurs="0" name="X" type="xs:decimal" />
 <xs:element minOccurs="0" name="Y" type="xs:decimal" />
 <xs:element minOccurs="0" name="Z" type="xs:decimal" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="CoordType" nillable="true" type="tns:CoordType" />
 <xs:complexType name="GetMapType">
  <xs:sequence>
 <xs:element minOccurs="0" name="BoundingBox" nillable="true" type="tns:EnvelopeType" />
 <xs:element minOccurs="0" name="CRS" nillable="true" type="xs:string" />
 <xs:element minOccurs="0" name="Elevation" nillable="true" type="tns:ElevationType" />
 <xs:element minOccurs="0" name="Exceptions" type="tns:ExceptionsType" />
 <xs:element minOccurs="0" name="Output" nillable="true" type="tns:OutputType" />
 <xs:element minOccurs="0" name="StyledLayerDescriptor" nillable="true" type="tns:StyledLayerDescriptor" />
 <xs:element minOccurs="0" name="Time" type="xs:dateTime" />
 <xs:element minOccurs="0" name="service" nillable="true" type="xs:string" />
 <xs:element minOccurs="0" name="version" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="GetMapType" nillable="true" type="tns:GetMapType" />
 <xs:complexType name="ElevationType">
 <xs:sequence>
 <xs:element xmlns:q5="http://schemas.microsoft.com/2003/10/Serialization/Arrays" minOccurs="0" name="Items" nillable="true" type="q5:ArrayOfanyType" />
 </xs:sequence>
  </xs:complexType>
 <xs:element name="ElevationType" nillable="true" type="tns:ElevationType" />
 <xs:simpleType name="ExceptionsType">
 <xs:restriction base="xs:string" />
 </xs:simpleType>
 <xs:element name="ExceptionsType" nillable="true" type="tns:ExceptionsType" />
 <xs:complexType name="StyledLayerDescriptor">
 <xs:sequence>
 <xs:element minOccurs="0" name="Description" nillable="true" type="tns:DescriptionType" />
 <xs:element xmlns:q6="http://schemas.microsoft.com/2003/10/Serialization/Arrays" minOccurs="0" name="Items" nillable="true" type="q6:ArrayOfanyType" />
 <xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
 <xs:element minOccurs="0" name="UseSLDLibrary" nillable="true" type="tns:ArrayOfUseSLDLibrary" />
 <xs:element minOccurs="0" name="version" type="tns:VersionType" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="StyledLayerDescriptor" nillable="true" type="tns:StyledLayerDescriptor" />
 <xs:complexType name="ArrayOfUseSLDLibrary">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="UseSLDLibrary" nillable="true" type="tns:UseSLDLibrary" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfUseSLDLibrary" nillable="true" type="tns:ArrayOfUseSLDLibrary" />
 <xs:complexType name="UseSLDLibrary">
 <xs:sequence>
 <xs:element name="_onlineResource" nillable="true" type="tns:OnlineResourceType" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="UseSLDLibrary" nillable="true" type="tns:UseSLDLibrary" />
 <xs:complexType name="OnlineResourceType">
 <xs:sequence>
 <xs:element name="_actuate" type="tns:actuateType" />
 <xs:element name="_arcrole" nillable="true" type="xs:string" />
 <xs:element name="_href" nillable="true" type="xs:string" />
 <xs:element name="_role" nillable="true" type="xs:string" />
 <xs:element name="_show" type="tns:showType" />
 <xs:element name="_title" nillable="true" type="xs:string" />
 <xs:element name="_type" type="tns:typeType" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="OnlineResourceType" nillable="true" type="tns:OnlineResourceType" />
  <xs:simpleType name="actuateType">
 <xs:restriction base="xs:string">
 <xs:enumeration value="onLoad" />
 <xs:enumeration value="onRequest" />
 <xs:enumeration value="other" />
 <xs:enumeration value="none" />
 </xs:restriction>
 </xs:simpleType>
 <xs:element name="actuateType" nillable="true" type="tns:actuateType" />
 <xs:simpleType name="showType">
 <xs:restriction base="xs:string">
  <xs:enumeration value="new" />
 <xs:enumeration value="replace" />
 <xs:enumeration value="embed" />
 <xs:enumeration value="other" />
 <xs:enumeration value="none" />
 </xs:restriction>
 </xs:simpleType>
 <xs:element name="showType" nillable="true" type="tns:showType" />
 <xs:simpleType name="typeType">
 <xs:restriction base="xs:string">
 <xs:enumeration value="simple" />
 <xs:enumeration value="extended" />
 <xs:enumeration value="title" />
 <xs:enumeration value="resource" />
 <xs:enumeration value="locator" />
  <xs:enumeration value="arc" />
 </xs:restriction>
 </xs:simpleType>
 <xs:element name="typeType" nillable="true" type="tns:typeType" />
 </xs:schema>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
 <xs:complexType name="ArrayOfanyType">
 <xs:sequence>
  <xs:element minOccurs="0" maxOccurs="unbounded" name="anyType" nillable="true" type="xs:anyType" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfanyType" nillable="true" type="tns:ArrayOfanyType" />
 <xs:complexType name="ArrayOfstring">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfstring" nillable="true" type="tns:ArrayOfstring" />
 </xs:schema>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://schemas.opengis.net/wms/soap">
 <xs:import namespace="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP.v1_3_0" />
 <xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
 <xs:import namespace="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP" />
 <xs:import namespace="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP.SLD" />
 <xs:element name="GetVersion">
 <xs:complexType>
 <xs:sequence />
 </xs:complexType>
 </xs:element>
 <xs:element name="GetVersionResponse">
 <xs:complexType>
 <xs:sequence>
 <xs:element minOccurs="0" name="GetVersionResult" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 </xs:element>
 <xs:element name="GetCapabilities">
 <xs:complexType>
 <xs:sequence />
 </xs:complexType>
 </xs:element>
 <xs:element name="GetCapabilitiesResponse">
 <xs:complexType>
 <xs:sequence>
 <xs:element xmlns:q1="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP.v1_3_0" minOccurs="0" name="GetCapabilitiesResult" nillable="true" type="q1:WMS_Capabilities" />
  </xs:sequence>
 </xs:complexType>
 </xs:element>
 <xs:element name="GetMap">
 <xs:complexType>
 <xs:sequence>
 <xs:element xmlns:q2="http://schemas.microsoft.com/2003/10/Serialization/Arrays" minOccurs="0" name="layers" nillable="true" type="q2:ArrayOfstring" />
 <xs:element xmlns:q3="http://schemas.microsoft.com/2003/10/Serialization/Arrays" minOccurs="0" name="styles" nillable="true" type="q3:ArrayOfstring" />
 <xs:element xmlns:q4="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP.v1_3_0" minOccurs="0" name="bounds" nillable="true" type="q4:BoundingBox" />
 <xs:element minOccurs="0" name="width" type="xs:int" />
  <xs:element minOccurs="0" name="height" type="xs:int" />
 <xs:element minOccurs="0" name="crs" nillable="true" type="xs:string" />
 <xs:element minOccurs="0" name="format" nillable="true" type="xs:string" />
  </xs:sequence>
 </xs:complexType>
 </xs:element>
 <xs:element name="GetMapResponse">
 <xs:complexType>
 <xs:sequence>
 <xs:element xmlns:q5="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP" minOccurs="0" name="GetMapResult" nillable="true" type="q5:BinaryResponse" />
 </xs:sequence>
 </xs:complexType>
 </xs:element>
 <xs:element name="PostMap">
 <xs:complexType>
 <xs:sequence>
 <xs:element xmlns:q6="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP.SLD" minOccurs="0" name="getMapSld" nillable="true" type="q6:GetMapType" />
 </xs:sequence>
 </xs:complexType>
 </xs:element>
 <xs:element name="PostMapResponse">
 <xs:complexType>
 <xs:sequence>
 <xs:element xmlns:q7="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP" minOccurs="0" name="PostMapResult" nillable="true" type="q7:BinaryResponse" />
 </xs:sequence>
 </xs:complexType>
 </xs:element>
 </xs:schema>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP.v1_3_0" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP.v1_3_0">
 <xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
 <xs:complexType name="WMS_Capabilities">
 <xs:sequence>
 <xs:element name="capabilityField" nillable="true" type="tns:Capability" />
 <xs:element name="serviceField" nillable="true" type="tns:Service" />
 <xs:element name="updateSequenceField" nillable="true" type="xs:string" />
 <xs:element name="versionField" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="WMS_Capabilities" nillable="true" type="tns:WMS_Capabilities" />
 <xs:complexType name="Capability">
 <xs:sequence>
 <xs:element xmlns:q1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" name="_ExtendedCapabilitiesField" nillable="true" type="q1:ArrayOfanyType" />
 <xs:element xmlns:q2="http://schemas.microsoft.com/2003/10/Serialization/Arrays" name="exceptionField" nillable="true" type="q2:ArrayOfstring" />
 <xs:element name="layerField" nillable="true" type="tns:Layer" />
 <xs:element name="requestField" nillable="true" type="tns:Request" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="Capability" nillable="true" type="tns:Capability" />
 <xs:complexType name="Layer">
 <xs:sequence>
 <xs:element name="abstractField" nillable="true" type="xs:string" />
 <xs:element name="attributionField" nillable="true" type="tns:Attribution" />
 <xs:element name="authorityURLField" nillable="true" type="tns:ArrayOfAuthorityURL" />
 <xs:element name="boundingBoxField" nillable="true" type="tns:ArrayOfBoundingBox" />
 <xs:element xmlns:q3="http://schemas.microsoft.com/2003/10/Serialization/Arrays" name="cRSField" nillable="true" type="q3:ArrayOfstring" />
 <xs:element name="cascadedField" nillable="true" type="xs:string" />
 <xs:element name="dataURLField" nillable="true" type="tns:ArrayOfDataURL" />
 <xs:element name="dimensionField" nillable="true" type="tns:ArrayOfDimension" />
 <xs:element name="eX_GeographicBoundingBoxField" nillable="true" type="tns:EX_GeographicBoundingBox" />
 <xs:element name="featureListURLField" nillable="true" type="tns:ArrayOfFeatureListURL" />
 <xs:element name="fixedHeightField" nillable="true" type="xs:string" />
  <xs:element name="fixedWidthField" nillable="true" type="xs:string" />
 <xs:element name="identifierField" nillable="true" type="tns:ArrayOfIdentifier" />
 <xs:element name="keywordListField" nillable="true" type="tns:ArrayOfKeyword" />
 <xs:element name="layer1Field" nillable="true" type="tns:ArrayOfLayer" />
 <xs:element name="maxScaleDenominatorField" type="xs:double" />
 <xs:element name="maxScaleDenominatorFieldSpecified" type="xs:boolean" />
 <xs:element name="metadataURLField" nillable="true" type="tns:ArrayOfMetadataURL" />
 <xs:element name="minScaleDenominatorField" type="xs:double" />
 <xs:element name="minScaleDenominatorFieldSpecified" type="xs:boolean" />
 <xs:element name="nameField" nillable="true" type="xs:string" />
 <xs:element name="noSubsetsField" type="xs:boolean" />
 <xs:element name="opaqueField" type="xs:boolean" />
 <xs:element name="queryableField" type="xs:boolean" />
 <xs:element name="styleField" nillable="true" type="tns:ArrayOfStyle" />
 <xs:element name="titleField" nillable="true" type="xs:string" />
 </xs:sequence>
  </xs:complexType>
 <xs:element name="Layer" nillable="true" type="tns:Layer" />
 <xs:complexType name="Attribution">
 <xs:sequence>
 <xs:element name="logoURLField" nillable="true" type="tns:LogoURL" />
 <xs:element name="onlineResourceField" nillable="true" type="tns:OnlineResource" />
 <xs:element name="titleField" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="Attribution" nillable="true" type="tns:Attribution" />
 <xs:complexType name="LogoURL">
 <xs:sequence>
 <xs:element name="formatField" nillable="true" type="xs:string" />
 <xs:element name="heightField" nillable="true" type="xs:string" />
 <xs:element name="onlineResourceField" nillable="true" type="tns:OnlineResource" />
 <xs:element name="widthField" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="LogoURL" nillable="true" type="tns:LogoURL" />
 <xs:complexType name="OnlineResource">
 <xs:sequence>
 <xs:element name="actuateField" type="tns:actuateType" />
 <xs:element name="actuateFieldSpecified" type="xs:boolean" />
 <xs:element name="arcroleField" nillable="true" type="xs:string" />
 <xs:element name="hrefField" nillable="true" type="xs:string" />
 <xs:element name="roleField" nillable="true" type="xs:string" />
 <xs:element name="showField" type="tns:showType" />
 <xs:element name="showFieldSpecified" type="xs:boolean" />
 <xs:element name="titleField" nillable="true" type="xs:string" />
 <xs:element name="typeField" type="tns:typeType" />
 <xs:element name="typeFieldSpecified" type="xs:boolean" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="OnlineResource" nillable="true" type="tns:OnlineResource" />
 <xs:simpleType name="actuateType">
 <xs:restriction base="xs:string">
 <xs:enumeration value="onLoad" />
 <xs:enumeration value="onRequest" />
 <xs:enumeration value="other" />
 <xs:enumeration value="none" />
 </xs:restriction>
 </xs:simpleType>
 <xs:element name="actuateType" nillable="true" type="tns:actuateType" />
 <xs:simpleType name="showType">
 <xs:restriction base="xs:string">
 <xs:enumeration value="new" />
 <xs:enumeration value="replace" />
 <xs:enumeration value="embed" />
 <xs:enumeration value="other" />
 <xs:enumeration value="none" />
 </xs:restriction>
 </xs:simpleType>
 <xs:element name="showType" nillable="true" type="tns:showType" />
 <xs:simpleType name="typeType">
 <xs:restriction base="xs:string">
 <xs:enumeration value="simple" />
 <xs:enumeration value="extended" />
 <xs:enumeration value="title" />
 <xs:enumeration value="resource" />
  <xs:enumeration value="locator" />
 <xs:enumeration value="arc" />
 </xs:restriction>
 </xs:simpleType>
 <xs:element name="typeType" nillable="true" type="tns:typeType" />
 <xs:complexType name="ArrayOfAuthorityURL">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="AuthorityURL" nillable="true" type="tns:AuthorityURL" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfAuthorityURL" nillable="true" type="tns:ArrayOfAuthorityURL" />
 <xs:complexType name="AuthorityURL">
 <xs:sequence>
 <xs:element name="nameField" nillable="true" type="xs:string" />
  <xs:element name="onlineResourceField" nillable="true" type="tns:OnlineResource" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="AuthorityURL" nillable="true" type="tns:AuthorityURL" />
 <xs:complexType name="ArrayOfBoundingBox">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="BoundingBox" nillable="true" type="tns:BoundingBox" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfBoundingBox" nillable="true" type="tns:ArrayOfBoundingBox" />
 <xs:complexType name="BoundingBox">
 <xs:sequence>
 <xs:element name="cRSField" nillable="true" type="xs:string" />
 <xs:element name="maxxField" type="xs:double" />
 <xs:element name="maxyField" type="xs:double" />
 <xs:element name="minxField" type="xs:double" />
 <xs:element name="minyField" type="xs:double" />
 <xs:element name="resxField" type="xs:double" />
 <xs:element name="resxFieldSpecified" type="xs:boolean" />
 <xs:element name="resyField" type="xs:double" />
 <xs:element name="resyFieldSpecified" type="xs:boolean" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="BoundingBox" nillable="true" type="tns:BoundingBox" />
 <xs:complexType name="ArrayOfDataURL">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="DataURL" nillable="true" type="tns:DataURL" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfDataURL" nillable="true" type="tns:ArrayOfDataURL" />
 <xs:complexType name="DataURL">
 <xs:sequence>
 <xs:element name="formatField" nillable="true" type="xs:string" />
 <xs:element name="onlineResourceField" nillable="true" type="tns:OnlineResource" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="DataURL" nillable="true" type="tns:DataURL" />
 <xs:complexType name="ArrayOfDimension">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="Dimension" nillable="true" type="tns:Dimension" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfDimension" nillable="true" type="tns:ArrayOfDimension" />
 <xs:complexType name="Dimension">
 <xs:sequence>
 <xs:element name="currentField" type="xs:boolean" />
 <xs:element name="currentFieldSpecified" type="xs:boolean" />
  <xs:element name="defaultField" nillable="true" type="xs:string" />
 <xs:element name="multipleValuesField" type="xs:boolean" />
 <xs:element name="multipleValuesFieldSpecified" type="xs:boolean" />
 <xs:element name="nameField" nillable="true" type="xs:string" />
 <xs:element name="nearestValueField" type="xs:boolean" />
 <xs:element name="nearestValueFieldSpecified" type="xs:boolean" />
 <xs:element name="unitSymbolField" nillable="true" type="xs:string" />
 <xs:element name="unitsField" nillable="true" type="xs:string" />
 <xs:element name="valueField" nillable="true" type="xs:string" />
  </xs:sequence>
 </xs:complexType>
 <xs:element name="Dimension" nillable="true" type="tns:Dimension" />
 <xs:complexType name="EX_GeographicBoundingBox">
 <xs:sequence>
 <xs:element name="eastBoundLongitudeField" type="xs:double" />
 <xs:element name="northBoundLatitudeField" type="xs:double" />
 <xs:element name="southBoundLatitudeField" type="xs:double" />
 <xs:element name="westBoundLongitudeField" type="xs:double" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="EX_GeographicBoundingBox" nillable="true" type="tns:EX_GeographicBoundingBox" />
 <xs:complexType name="ArrayOfFeatureListURL">
 <xs:sequence>
  <xs:element minOccurs="0" maxOccurs="unbounded" name="FeatureListURL" nillable="true" type="tns:FeatureListURL" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfFeatureListURL" nillable="true" type="tns:ArrayOfFeatureListURL" />
 <xs:complexType name="FeatureListURL">
 <xs:sequence>
 <xs:element name="formatField" nillable="true" type="xs:string" />
 <xs:element name="onlineResourceField" nillable="true" type="tns:OnlineResource" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="FeatureListURL" nillable="true" type="tns:FeatureListURL" />
 <xs:complexType name="ArrayOfIdentifier">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="Identifier" nillable="true" type="tns:Identifier" />
 </xs:sequence>
 </xs:complexType>
  <xs:element name="ArrayOfIdentifier" nillable="true" type="tns:ArrayOfIdentifier" />
 <xs:complexType name="Identifier">
 <xs:sequence>
 <xs:element name="authorityField" nillable="true" type="xs:string" />
  <xs:element name="valueField" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="Identifier" nillable="true" type="tns:Identifier" />
 <xs:complexType name="ArrayOfKeyword">
  <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="Keyword" nillable="true" type="tns:Keyword" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfKeyword" nillable="true" type="tns:ArrayOfKeyword" />
 <xs:complexType name="Keyword">
 <xs:sequence>
 <xs:element name="valueField" nillable="true" type="xs:string" />
 <xs:element name="vocabularyField" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="Keyword" nillable="true" type="tns:Keyword" />
 <xs:complexType name="ArrayOfLayer">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="Layer" nillable="true" type="tns:Layer" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfLayer" nillable="true" type="tns:ArrayOfLayer" />
  <xs:complexType name="ArrayOfMetadataURL">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="MetadataURL" nillable="true" type="tns:MetadataURL" />
 </xs:sequence>
 </xs:complexType>
  <xs:element name="ArrayOfMetadataURL" nillable="true" type="tns:ArrayOfMetadataURL" />
 <xs:complexType name="MetadataURL">
 <xs:sequence>
 <xs:element name="formatField" nillable="true" type="xs:string" />
  <xs:element name="onlineResourceField" nillable="true" type="tns:OnlineResource" />
 <xs:element name="typeField" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="MetadataURL" nillable="true" type="tns:MetadataURL" />
 <xs:complexType name="ArrayOfStyle">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="Style" nillable="true" type="tns:Style" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfStyle" nillable="true" type="tns:ArrayOfStyle" />
 <xs:complexType name="Style">
 <xs:sequence>
 <xs:element name="abstractField" nillable="true" type="xs:string" />
 <xs:element name="legendURLField" nillable="true" type="tns:ArrayOfLegendURL" />
 <xs:element name="nameField" nillable="true" type="xs:string" />
 <xs:element name="styleSheetURLField" nillable="true" type="tns:StyleSheetURL" />
 <xs:element name="styleURLField" nillable="true" type="tns:StyleURL" />
 <xs:element name="titleField" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="Style" nillable="true" type="tns:Style" />
 <xs:complexType name="ArrayOfLegendURL">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="LegendURL" nillable="true" type="tns:LegendURL" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfLegendURL" nillable="true" type="tns:ArrayOfLegendURL" />
 <xs:complexType name="LegendURL">
 <xs:sequence>
 <xs:element name="formatField" nillable="true" type="xs:string" />
 <xs:element name="heightField" nillable="true" type="xs:string" />
 <xs:element name="onlineResourceField" nillable="true" type="tns:OnlineResource" />
 <xs:element name="widthField" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="LegendURL" nillable="true" type="tns:LegendURL" />
  <xs:complexType name="StyleSheetURL">
 <xs:sequence>
 <xs:element name="formatField" nillable="true" type="xs:string" />
 <xs:element name="onlineResourceField" nillable="true" type="tns:OnlineResource" />
  </xs:sequence>
 </xs:complexType>
 <xs:element name="StyleSheetURL" nillable="true" type="tns:StyleSheetURL" />
 <xs:complexType name="StyleURL">
 <xs:sequence>
 <xs:element name="formatField" nillable="true" type="xs:string" />
 <xs:element name="onlineResourceField" nillable="true" type="tns:OnlineResource" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="StyleURL" nillable="true" type="tns:StyleURL" />
 <xs:complexType name="Request">
 <xs:sequence>
 <xs:element name="_ExtendedOperationField" nillable="true" type="tns:ArrayOfOperationType" />
 <xs:element name="getCapabilitiesField" nillable="true" type="tns:OperationType" />
 <xs:element name="getFeatureInfoField" nillable="true" type="tns:OperationType" />
 <xs:element name="getMapField" nillable="true" type="tns:OperationType" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="Request" nillable="true" type="tns:Request" />
 <xs:complexType name="ArrayOfOperationType">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="OperationType" nillable="true" type="tns:OperationType" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfOperationType" nillable="true" type="tns:ArrayOfOperationType" />
 <xs:complexType name="OperationType">
 <xs:sequence>
 <xs:element name="dCPTypeField" nillable="true" type="tns:ArrayOfDCPType" />
 <xs:element xmlns:q4="http://schemas.microsoft.com/2003/10/Serialization/Arrays" name="formatField" nillable="true" type="q4:ArrayOfstring" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="OperationType" nillable="true" type="tns:OperationType" />
 <xs:complexType name="ArrayOfDCPType">
 <xs:sequence>
 <xs:element minOccurs="0" maxOccurs="unbounded" name="DCPType" nillable="true" type="tns:DCPType" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ArrayOfDCPType" nillable="true" type="tns:ArrayOfDCPType" />
 <xs:complexType name="DCPType">
 <xs:sequence>
 <xs:element name="hTTPField" nillable="true" type="tns:HTTP" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="DCPType" nillable="true" type="tns:DCPType" />
 <xs:complexType name="HTTP">
 <xs:sequence>
 <xs:element name="getField" nillable="true" type="tns:Get" />
  <xs:element name="postField" nillable="true" type="tns:Post" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="HTTP" nillable="true" type="tns:HTTP" />
 <xs:complexType name="Get">
 <xs:sequence>
 <xs:element name="onlineResourceField" nillable="true" type="tns:OnlineResource" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="Get" nillable="true" type="tns:Get" />
 <xs:complexType name="Post">
 <xs:sequence>
 <xs:element name="onlineResourceField" nillable="true" type="tns:OnlineResource" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="Post" nillable="true" type="tns:Post" />
 <xs:complexType name="Service">
 <xs:sequence>
 <xs:element name="abstractField" nillable="true" type="xs:string" />
 <xs:element name="accessConstraintsField" nillable="true" type="xs:string" />
  <xs:element name="contactInformationField" nillable="true" type="tns:ContactInformation" />
 <xs:element name="feesField" nillable="true" type="xs:string" />
 <xs:element name="keywordListField" nillable="true" type="tns:ArrayOfKeyword" />
 <xs:element name="layerLimitField" nillable="true" type="xs:string" />
 <xs:element name="maxHeightField" nillable="true" type="xs:string" />
 <xs:element name="maxWidthField" nillable="true" type="xs:string" />
 <xs:element name="nameField" type="tns:ServiceName" />
 <xs:element name="onlineResourceField" nillable="true" type="tns:OnlineResource" />
 <xs:element name="titleField" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="Service" nillable="true" type="tns:Service" />
 <xs:complexType name="ContactInformation">
 <xs:sequence>
 <xs:element name="contactAddressField" nillable="true" type="tns:ContactAddress" />
 <xs:element name="contactElectronicMailAddressField" nillable="true" type="xs:string" />
 <xs:element name="contactFacsimileTelephoneField" nillable="true" type="xs:string" />
 <xs:element name="contactPersonPrimaryField" nillable="true" type="tns:ContactPersonPrimary" />
 <xs:element name="contactPositionField" nillable="true" type="xs:string" />
 <xs:element name="contactVoiceTelephoneField" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ContactInformation" nillable="true" type="tns:ContactInformation" />
 <xs:complexType name="ContactAddress">
 <xs:sequence>
 <xs:element name="addressField" nillable="true" type="xs:string" />
 <xs:element name="addressTypeField" nillable="true" type="xs:string" />
 <xs:element name="cityField" nillable="true" type="xs:string" />
 <xs:element name="countryField" nillable="true" type="xs:string" />
 <xs:element name="postCodeField" nillable="true" type="xs:string" />
 <xs:element name="stateOrProvinceField" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ContactAddress" nillable="true" type="tns:ContactAddress" />
 <xs:complexType name="ContactPersonPrimary">
 <xs:sequence>
  <xs:element name="contactOrganizationField" nillable="true" type="xs:string" />
 <xs:element name="contactPersonField" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="ContactPersonPrimary" nillable="true" type="tns:ContactPersonPrimary" />
 <xs:simpleType name="ServiceName">
 <xs:restriction base="xs:string">
 <xs:enumeration value="WMS" />
 </xs:restriction>
 </xs:simpleType>
 <xs:element name="ServiceName" nillable="true" type="tns:ServiceName" />
 </xs:schema>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/OGC.WMS.SOAP">
 <xs:import namespace="http://schemas.datacontract.org/2004/07/System.IO" />
 <xs:complexType name="BinaryResponse">
 <xs:sequence>
 <xs:element xmlns:q1="http://schemas.datacontract.org/2004/07/System.IO" minOccurs="0" name="BinaryPayload" nillable="true" type="q1:Stream" />
 <xs:element minOccurs="0" name="ContentType" nillable="true" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="BinaryResponse" nillable="true" type="tns:BinaryResponse" />
 </xs:schema>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/System.IO" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/System.IO">
 <xs:import namespace="http://schemas.datacontract.org/2004/07/System" />
 <xs:complexType name="Stream">
 <xs:complexContent mixed="false">
 <xs:extension xmlns:q1="http://schemas.datacontract.org/2004/07/System" base="q1:MarshalByRefObject">
  <xs:sequence />
 </xs:extension>
 </xs:complexContent>
 </xs:complexType>
 <xs:element name="Stream" nillable="true" type="tns:Stream" />
 <xs:complexType name="MemoryStream">
 <xs:complexContent mixed="false">
 <xs:extension base="tns:Stream">
 <xs:sequence>
 <xs:element name="_buffer" nillable="true" type="xs:base64Binary" />
 <xs:element name="_capacity" type="xs:int" />
 <xs:element name="_expandable" type="xs:boolean" />
 <xs:element name="_exposable" type="xs:boolean" />
 <xs:element name="_isOpen" type="xs:boolean" />
 <xs:element name="_length" type="xs:int" />
 <xs:element name="_origin" type="xs:int" />
 <xs:element name="_position" type="xs:int" />
 <xs:element name="_writable" type="xs:boolean" />
 </xs:sequence>
 </xs:extension>
 </xs:complexContent>
 </xs:complexType>
 <xs:element name="MemoryStream" nillable="true" type="tns:MemoryStream" />
 </xs:schema>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/System" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/System">
 <xs:complexType name="MarshalByRefObject">
 <xs:sequence>
 <xs:element name="__identity" nillable="true" type="xs:anyType" />
 </xs:sequence>
 </xs:complexType>
 <xs:element name="MarshalByRefObject" nillable="true" type="tns:MarshalByRefObject" />
 </xs:schema>
 </wsdl:types>
 <wsdl:message name="IWms_GetVersion_InputMessage">
 <wsdl:part name="parameters" element="tns:GetVersion" />
 </wsdl:message>
 <wsdl:message name="IWms_GetVersion_OutputMessage">
 <wsdl:part name="parameters" element="tns:GetVersionResponse" />
 </wsdl:message>
 <wsdl:message name="IWms_GetCapabilities_InputMessage">
 <wsdl:part name="parameters" element="tns:GetCapabilities" />
 </wsdl:message>
 <wsdl:message name="IWms_GetCapabilities_OutputMessage">
 <wsdl:part name="parameters" element="tns:GetCapabilitiesResponse" />
 </wsdl:message>
 <wsdl:message name="IWms_GetMap_InputMessage">
  <wsdl:part name="parameters" element="tns:GetMap" />
 </wsdl:message>
 <wsdl:message name="IWms_GetMap_OutputMessage">
 <wsdl:part name="parameters" element="tns:GetMapResponse" />
 </wsdl:message>
 <wsdl:message name="IWms_PostMap_InputMessage">
 <wsdl:part name="parameters" element="tns:PostMap" />
 </wsdl:message>
 <wsdl:message name="IWms_PostMap_OutputMessage">
 <wsdl:part name="parameters" element="tns:PostMapResponse" />
 </wsdl:message>
 <wsdl:portType name="IWms">
 <wsdl:operation name="GetVersion">
 <wsdl:input wsaw:Action="http://schemas.opengis.net/wms/soap/IWms/GetVersion" message="tns:IWms_GetVersion_InputMessage" />
 <wsdl:output wsaw:Action="http://schemas.opengis.net/wms/soap/IWms/GetVersionResponse" message="tns:IWms_GetVersion_OutputMessage" />
 </wsdl:operation>
 <wsdl:operation name="GetCapabilities">
 <wsdl:input wsaw:Action="http://schemas.opengis.net/wms/soap/IWms/GetCapabilities" message="tns:IWms_GetCapabilities_InputMessage" />
 <wsdl:output wsaw:Action="http://schemas.opengis.net/wms/soap/IWms/GetCapabilitiesResponse" message="tns:IWms_GetCapabilities_OutputMessage" />
 </wsdl:operation>
 <wsdl:operation name="GetMap">
 <wsdl:input wsaw:Action="http://schemas.opengis.net/wms/soap/IWms/GetMap" message="tns:IWms_GetMap_InputMessage" />
 <wsdl:output wsaw:Action="http://schemas.opengis.net/wms/soap/IWms/GetMapResponse" message="tns:IWms_GetMap_OutputMessage" />
 </wsdl:operation>
 <wsdl:operation name="PostMap">
 <wsdl:input wsaw:Action="http://schemas.opengis.net/wms/soap/IWms/PostMap" message="tns:IWms_PostMap_InputMessage" />
 <wsdl:output wsaw:Action="http://schemas.opengis.net/wms/soap/IWms/PostMapResponse" message="tns:IWms_PostMap_OutputMessage" />
 </wsdl:operation>
 </wsdl:portType>
 <wsdl:binding name="BasicHttpBinding_IWms" type="tns:IWms">
 <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
 <wsdl:operation name="GetVersion">
 <soap:operation soapAction="http://schemas.opengis.net/wms/soap/IWms/GetVersion" style="document" />
 <wsdl:input>
 <soap:body use="literal" />
 </wsdl:input>
 <wsdl:output>
 <soap:body use="literal" />
 </wsdl:output>
 </wsdl:operation>
 <wsdl:operation name="GetCapabilities">
 <soap:operation soapAction="http://schemas.opengis.net/wms/soap/IWms/GetCapabilities" style="document" />
 <wsdl:input>
 <soap:body use="literal" />
 </wsdl:input>
 <wsdl:output>
 <soap:body use="literal" />
 </wsdl:output>
 </wsdl:operation>
 <wsdl:operation name="GetMap">
  <soap:operation soapAction="http://schemas.opengis.net/wms/soap/IWms/GetMap" style="document" />
 <wsdl:input>
 <soap:body use="literal" />
 </wsdl:input>
 <wsdl:output>
 <soap:body use="literal" />
 </wsdl:output>
 </wsdl:operation>
 <wsdl:operation name="PostMap">
 <soap:operation soapAction="http://schemas.opengis.net/wms/soap/IWms/PostMap" style="document" />
 <wsdl:input>
 <soap:body use="literal" />
 </wsdl:input>
 <wsdl:output>
 <soap:body use="literal" />
 </wsdl:output>
 </wsdl:operation>
 </wsdl:binding>
 <wsdl:service name="Wms130">
 <wsdl:port name="BasicHttpBinding_IWms" binding="tns:BasicHttpBinding_IWms">
 <soap:address location="http://52.7.88.185/WMSSOAP/Wms130.svc" />
 </wsdl:port>
 </wsdl:service>
</wsdl:definitions>

3. Modelling Security in SOAP

3.1. Introduction

For developing a secure service and client it is important to understand the overall relationships between all the building blocks that exist in the OGC Web Services world. There are two basic approaches for developing the client application:

  1. The client application development is directly using the service API implementation as defined in the service WSDL. The developer can use a tool to auto-generate the relevant code. For example, a WSDL2Java transformer could have been used. With this approach, the client application does use the service interface as defined in the WSDL.

  2. The client application development is based on some other description of the service API / interface. For example, the client application developer can use the appropriate OGC Web Service specification(s) to implement the code that uses the service interface properly.

Regardless of the approach, it is important to note that the service instance implements the API defined by the WSDL. This does guarantee immediate interoperability for the client type 1 above because the auto-generated client stubs fit exactly the service implementation. This is in particular important in cases where a WS-SecurityPolicy is used that declare the security requirements for the SOAP envelope.

fig4
Figure 4. UML-alike presentation of building blocks for a SOAP-based Web Service with security

3.2. WSDL and Security

The WSDL standard allows including a Web Services Policy (Ws-Policy) and its use via Web Services Policy 1.5 – Attachment, yet another W3C recommendation. One or multiple WS-Policy instances can be included in WSDL 2.0 as a direct child of the <wsdl:definitions> section and then be used from different sections of the WSDL, depending on the intended scope (for more information see WS-Policy-Attachment, Section 4.1, Figure 4.1) Each WS-Policy can then be used in the appropriate sections of the WSDL:

  1. Using a <wsp:PolicyReference> inside the <wsdl:service> section is effective for the entire service.

  2. Using a <wsp:PolicyReference> inside the <wsdl:binding> section is effective for all operations combined inside that binding.

  3. Using a <wsp:PolicyReference> inside the <wsdl:operation> section is effective for a particular operation of the service. This option is suitable to apply different policies for a particular operation. For example, the GetCapabilities operation might only require a username token, but the GetFeature operation requires that the request message is digitally signed and the response digitally signed and encrypted.

The example WFS service WSDL document included in Annex A outlines the following security constraints:

  1. Integrity: All inbound and outbound messages must be digitally signed.

  2. Confidentiality: The GetFeature operation response message must be encrypted.

  3. Authentication: The GetFeature operation response message must include a UsernameToken that identifies the user.

3.3. Service Capabilities

In addition to the role of the Capabilities document to constrain the possible values to be put into the data structures, and outlining the served content, security annotations can be used to declare different types of security requirements (more information in the OWS Common Security Extension ER). For this ER, it is important to note that one of the well-defined security constraints can be used to reference the WS-Policy. This is important to enable the client application at runtime to verify its own-implemented abilities to superset those listed in the WS-Policy for the service endpoint. This is in particular important if the client application was not developed on the basis of the service instance specific WSDL document!

It is important to have a security constraint defined (urn:ogc:def:tb12:security:policy for the exercises of this Testbed) that allows to point to different WS-Policy instances. This in particular as OWS Common does not support that a Capabilities document links to a WSDL document. The following mechanism is defined which leverages OWS Common element Constraint – the approach is therefore backwards compatible:

<!-- The normative reference a WS-Policy document is required
as it ultimately defines the security constraints for the SOAP envelope -->
<ows:Constraint name="urn:ogc:def:tb12:security:policy">
<ows:ValuesReference ows:reference="http://www.example.com/ows/WS-Policy.xml"/>
</ows:Constraint>

Appendix B illustrates the security annotation of a service instance example that is described by the WSDL above.

3.4. Service Implementation

The fact that security is present on the service endpoint has implications on the interoperability of the service instance. In order to understand the implications, it is helpful to look at the ISO/OSI model. Any security that is applied up to session layer (OSI layer 5) have no direct implication on the SOAP message structure. Dominant examples are HTTP over TLS (layer 5) or HTTP Basic or Digest authentication. However, it is required to note that the application itself (residing on OSI layer 7) is capable of instrumenting existing libraries properly. For example, in order to establish a HTTPS communication, the application must request a TLS network connection and validate the server side certificate presented. For HTTP Basic/Digest authentication, the application must be capable of handling the HTTP response with code 401 “Authorization required”, which typically is done via a callback function to display a communication dialog to the user to request credentials. Bottom line: the application must deal with existing network libraries properly to handle security challenges signaled from the communication layer.

The world changes in case that the security requirements are to be implemented in SOAP. As SOAP is based on XML encoding, any requirements refer to the presentation layer (layer 6 in OSI). For example, if authentication via a username token and a digital signature are required on the SOAP message, the application must first create the token, insert it into the SOAP envelope and then calculate the digital signature and apply it to the SOAP message. At this point, no layer 5 libraries are involved.

In order to describe the security requirements for SOAP messages based communication, a Web Services Policy (WS-Policy) can be used. A policy instance is specific to a service endpoint, as it outlines specific security requirements that must be applied to the SOAP message. In case the SOAP message received by the service is not compliant with the policy, the processing is rejected and a SOAP fault message is returned to the caller.

The integration of a WS-Policy into a WSDL for a service instance is rather simple: the WSDL schema supports the inline use of a WS-Policy to be able to express the specific security constraints for the service instance. It is important to note that WS-Policy can define procedural conditions, e.g. authentication tokens are to inserted into messages or a digital signature or encryption is to be applied to the message, but also define allowed cipher algorithms, which makes WS-Policy a kind of a replica for the security conditions that can be applied to a communication link. But, it is important that the conditions from WS-Policy are independent from the underlying network options. So for example, if the underlying Web Server allows SSLv2, the WS-Policy could disallow that.

In that sense, the structure of an implementation can be seen as a sandwich of libraries that “deal” with requirements applicable to the different layers of the OSI model. In particular, the auto-generated code from a WSDL creates a library that corresponds to layer 6 where the security part relates to communication library effective to layer 5. It is therefore possible to implement an application using distinct libraries matching a particular purpose:

  1. Layer 5 library does contain the security routines to apply security to a communication link

  2. Layer 6 library does contain the security routines to be applied to the representation layer

3.5. Client Implementation

In case security requirements exist for the SOAP messages, the WSDL can no longer be seen generic for a service type. It must be understood to be applicable for a particular service instance. This is because the security constraints are typically service instance specific and service type independent.

For SOAP enabled OGC Web Service, the generation of the SOAP API is necessary but not sufficient. The client application can still not communicate with the client, as other hosting specific information is missing. However - as illustrated above - a generic GetCapabilties operation can always be implemented which is capable of fetching the required Capabilities document. The commonly available operation GetCapabilities requires either a version information to be present in the request or the client must indicate its ability for version negotiation by providing information which versions it would accept. The information how to create SOAP message instances requires the knowledge about the actual provisioning of the service instance. This information can be obtained from the service instance capabilities document. Even though the information in a Capabilities document is service instance specific, it is also service type specific. It is therefore possible for the client implementation to develop a service type specific marshalling object that gets initialized by parsing the capabilities document.

3.6. Annex A - Examples of WSDL Using WS-Policy

The following WSDL instance document defines a SOAP enabled WFS 2.0 service instance with the network endpoint https://www.example.com The service only supports two operations: GetCapabilities and GetFeature. The SOAP security is as follows:

  1. All inbound and outbound messages must be digitally signed to implement the integrity requirement.

  2. All inbound messages carrying a GetFeature operation request must contain a UsernameToken (and be digitally signed).

  3. All outbound messages that are the response to a GetFeature operation carrying a FeatureCollection must be encrypted (and digitally signed).

The service instance described also uses Web Services Addressing (<wsa:To>) to "route" an inbound message to the appropriate receiver that links the message with the message. In addition, a unique message identifier is required to support the asynchronous case (an outbound message links to an inbound message via this identifier).

<!--?xml version="1.0" encoding="ISO-8859-1"?-->
<wsdl:definitions targetNamespace="http://www.example.com/wfs/2.0"
 xmlns:sd="http://www.example.com/wfs/2.0"
 xmlns:wfs-soap="http://www.opengis.net/wfs/soap/2.0"
 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
 xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:wfs-util="http://www.opengis.net/wfs-util/2.0"
 xmlns:wfs-req="http://www.opengis.net/wfs/requests/2.0"
 xmlns:wfs-resp="http://www.opengis.net/wfs/responses/2.0"
 xmlns:wfs="http://www.opengis.net/wfs/2.0"
 xmlns:ows="http://www.opengis.net/ows/1.1"
 xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
 xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"
 xmlns:wsa="http://www.w3.org/2005/08/addressing">
  <wsdl:documentation xmlns:dc="http://purl.org/dc/elements/1.1/">
    <dc:date>2016-07-12</dc:date>
    <dc:description>This WSDL document defines the service-specific properties
      of a WFS implementation with WS-Security in place as specififed by the WS-SecurityPolicy
      referenced from the WSDL.</dc:description>
  </wsdl:documentation>
  <wsp:Policy wsu:Id="Integrity" >
    <sp:SignedParts>
      <sp:Body />
    </sp:SignedParts>
  </wsp:Policy>
  <wsp:Policy wsu:Id="Confidentiality" >
    <sp:EncryptedParts>
      <sp:Body />
    </sp:EncryptedParts>
  </wsp:Policy>
  <wsp:Policy wsu:Id="UsernameToken">
    <wsp:ExactlyOne>
      <wsp:All>
        <sp:AsymmetricBinding>
          <wsp:Policy>
            <sp:InitiatorToken>
              <wsp:Policy>
                <sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
                  <wsp:Policy>
                    <sp:WssX509V3Token10/>
                  </wsp:Policy>
                </sp:X509Token>
              </wsp:Policy>
            </sp:InitiatorToken>
            <sp:RecipientToken>
              <wsp:Policy>
                <sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Never">
                  <wsp:Policy>
                    <sp:WssX509V3Token10/>
                  </wsp:Policy>
                </sp:X509Token>
              </wsp:Policy>
            </sp:RecipientToken>
            <sp:Layout>
              <wsp:Policy>
                <sp:Strict/>
              </wsp:Policy>
            </sp:Layout>
            <sp:AlgorithmSuite>
              <wsp:Policy>
                <sp:Basic256Rsa15/>
              </wsp:Policy>
            </sp:AlgorithmSuite>
          </wsp:Policy>
        </sp:AsymmetricBinding>
        <sp:Wss10>
          <wsp:Policy>
            <sp:MustSupportRefKeyIdentifier/>
            <sp:MustSupportRefEmbeddedToken/>
            <sp:MustSupportRefIssuerSerial/>
          </wsp:Policy>
        </sp:Wss10>
        <sp:SignedSupportingTokens>
          <wsp:Policy>
            <sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Always"/>
          </wsp:Policy>
        </sp:SignedSupportingTokens>
      </wsp:All>
    </wsp:ExactlyOne>
  </wsp:Policy>
  <wsdl:types>
    <xsd:schema targetNamespace="http://www.opengis.net/wfs/2.0"
      xmlns:wfs="http://www.opengis.net/wfs/2.0"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      elementFormDefault="qualified" version="1.1.0">
      <xsd:include schemaLocation="http://schemas.opengis.net/wfs/2.0/wfs.xsd"/>
      <xsd:import namespace="http://www.opengis.net/ows/1.1" schemaLocation="http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd"/>
    </xsd:schema>
    <xsd:schema targetNamespace="http://www.w3.org/2005/08/addressing"
      xmlns:wsa="http://www.w3.org/2005/08/addressing"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.1.0">
      <xsd:include schemaLocation="https://www.w3.org/2006/03/addressing/ws-addr.xsd"/>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="wsaHeader">
    <wsdl:part name="To" element="wsa:To"/>
    <wsdl:part name="Action" element="wsa:Action"/>
    <wsdl:part name="MessageID" element="wsa:MessageID"/>
  </wsdl:message>
  <wsdl:message name="ServiceExceptionMessage">
    <wsdl:part element="ows:ExceptionReport" name="Body"/>
  </wsdl:message>
  <wsdl:message name="CapabilitiesMessage">
    <wsdl:part element="wfs:WFS_Capabilities" name="Capabilities"/>
  </wsdl:message>
  <wsdl:message name="GetCapabilitiesMessage">
    <wsdl:part element="wfs:GetCapabilities" name="GetCapabilities"/>
  </wsdl:message>
  <wsdl:message name="FeatureCollectionMessage">
    <!-- PolicyReference applies to the outbound message carrying a FeatureCollection -->
    <wsp:PolicyReference wsdl:required="true" URI="#Confidentiality"/>
    <wsdl:part element="wfs:FeatureCollection" name="FeatureColleciton"/>
  </wsdl:message>
  <wsdl:message name="GetFeatureMessage">
    <wsdl:part element="wfs:GetFeature" name="GetFeature"/>
  </wsdl:message>
  <wsdl:portType name="WFS">
    <wsdl:operation name="wfs.getCapabilities">
      <wsdl:input name="GetCapabilitiesRequest" message="sd:GetCapabilitiesMessage"/>
      <wsdl:output name="GetCapabilitiesResponse" message="sd:CapabilitiesMessage"/>
      <wsdl:fault name="ServiceExceptionReport" message="sd:ServiceExceptionMessage"/>
    </wsdl:operation>
    <wsdl:operation name="wfs.getFeature">
      <wsdl:input name="GetFeatureRequest" message="sd:GetFeatureMessage"/>
      <wsdl:output name="GetFeatureResponse" message="sd:FeatureCollectionMessage"/>
      <wsdl:fault name="ServiceExceptionReport" message="sd:ServiceExceptionMessage"/>
    </wsdl:operation>
  </wsdl:portType>
    <wsdl:binding name="SOAP" type="sd:WFS">
      <wsdl:documentation>
        WFS interface bound to SOAP over HTTP/1.1. With WS-Security
      </wsdl:documentation>
      <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
      <wsa:UsingAddressing wsdl:required="true"/>
      <wsdl:operation name="wfs.getCapabilities">
        <soap:operation soapAction="http://www.opengis.net/wfs/requests#GetCapabilities" style="document"/>
        <wsdl:input>
          <soap:header message="sd:wsaHeader" part="To" use="literal"/>
          <soap:header message="sd:wsaHeader" part="Action" use="literal"/>
          <soap:header message="sd:wsaHeader" part="MessageID" use="literal"/>
          <soap:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
          <soap:body use="literal"/>
        </wsdl:output>
        <wsdl:fault name="ServiceExceptionReport">
          <soap:fault use="literal" name="ServiceExceptionReport"/>
        </wsdl:fault>
      </wsdl:operation>
      <wsdl:operation name="wfs.getFeature">
        <soap:operation soapAction="http://www.opengis.net/wfs/requests#GetFeature" style="document"/>
        <!-- PolicyReference applies to the operation GetFeature -->
        <wsp:PolicyReference wsdl:required="true" URI="#UsernameToken"/>
        <wsdl:input>
          <soap:header message="sd:wsaHeader" part="To" use="literal"/>
          <soap:header message="sd:wsaHeader" part="Action" use="literal"/>
          <soap:header message="sd:wsaHeader" part="MessageID" use="literal"/>
          <soap:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
          <soap:body use="literal"/>
        </wsdl:output>
        <wsdl:fault name="ServiceExceptionReport">
          <soap:fault use="literal" name="ServiceExceptionReport"/>
        </wsdl:fault>
      </wsdl:operation>
    </wsdl:binding>
  <wsdl:service name="WFS-SD">
    <!-- PolicyReference applies to the entire service (all inbound and outbound messages) -->
    <wsp:PolicyReference wsdl:required="true" URI="#Integrity"/>
    <wsdl:port name="wfsSOAP" binding="sd:SOAP">
      <soap:address location="https://tb12.example.com/soap/services"/>
      <wsa:To>https://tb12.example.com/soap/services/ows_proxy</wsa:To>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

3.7. Annex B: Sample Service Capabilities linking to the WS-Policy

3.7.1. Capabilities Document Fragment

The following table includes a simplified Capabilities document based on the WFS 2.0 CITE setup from lat/lon. The original capabilities document was shortened by removing not required operations, feature type offerings and implemented OGC Filter.

<!--?xml version="1.0" encoding="UTF-8"?-->
<!-- This Capabilities document got modified from the original to meet illustrational purposes for TB12 -->
<WFS_Capabilities version="2.0.0"
 xmlns="http://www.opengis.net/wfs/2.0"
 xmlns:wfs="http://www.opengis.net/wfs/2.0"
 xmlns:ows="http://www.opengis.net/ows/1.1"
 xmlns:ogc="http://www.opengis.net/ogc"
 xmlns:fes="http://www.opengis.net/fes/2.0"
 xmlns:gml="http://www.opengis.net/gml"
 xmlns:xlink="http://www.w3.org/1999/xlink"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd">
  <ows:ServiceIdentification>
    <ows:Title>WFS 2.0.0 TB12 used for security annotations</ows:Title>
    <ows:Abstract>Used to illustrate the use of security annotations using the ows:Constraint element</ows:Abstract>
    <ows:ServiceType codeSpace="http://www.opengeospatial.org/">WFS</ows:ServiceType>
    <ows:ServiceTypeVersion>2.0.0</ows:ServiceTypeVersion>
  </ows:ServiceIdentification>
  <ows:OperationsMetadata>
    <ows:Operation name="GetCapabilities">
      <ows:DCP>
        <ows:HTTP>
          <ows:Post xlink:href="http://cite.deegree.org/deegree-webservices-3.3.14/services/wfs200"/>
        </ows:HTTP>
      </ows:DCP>
      <ows:Parameter name="AcceptVersions">
        <ows:AllowedValues>
          <ows:Value>2.0.0</ows:Value>
        </ows:AllowedValues>
      </ows:Parameter>
      <ows:Parameter name="AcceptFormats">
        <ows:AllowedValues>
          <ows:Value>text/xml</ows:Value>
        </ows:AllowedValues>
      </ows:Parameter>
      <ows:Parameter name="Sections">
        <ows:AllowedValues>
          <ows:Value>ServiceIdentification</ows:Value>
          <ows:Value>ServiceProvider</ows:Value>
          <ows:Value>OperationsMetadata</ows:Value>
          <ows:Value>FeatureTypeList</ows:Value>
          <ows:Value>Filter_Capabilities</ows:Value>
        </ows:AllowedValues>
      </ows:Parameter>
    </ows:Operation>
    <ows:Operation name="GetFeature">
      <ows:DCP>
        <ows:HTTP>
          <ows:Post xlink:href="http://www.example.com/WFS"/>
        </ows:HTTP>
      </ows:DCP>
    </ows:Operation>
    <ows:Parameter name="version">
      <ows:AllowedValues>
        <ows:Value>2.0.0</ows:Value>
      </ows:AllowedValues>
    </ows:Parameter>
    <!-- The normative eference a WS-Policy document is required as it ultimately defines the security constraints for the SOAP envelope -->
    <ows:Constraint name="urn:ogc:def:tb12:security:policy">
      <ows:ValuesReference ows:reference="http://www.example.com/ows/WS-Policy.xml"/>
    </ows:Constraint>
  </ows:OperationsMetadata>
</WFS_Capabilities>

Table: Capabilities with correct security annotation

3.7.2. Sample INCORRECT Capabilities Document

The following Capabilities document illustrates an incorrect annotation use that is not conformant to the security constraints outlined in the WSDL. It is incorrect in that the WSDL part defines the security constraint ?#Confidentiality? via a WS-Policy that only applies to the WFS response for the GetFeature operation message, but the constraint does not apply to the request message. The incorrect part is commented accordingly.

<?xml version="1.0" encoding="UTF-8"?>
<!--
 This Capabilities document got modified from the original to meet illustrational purposes for TB12
-->
<WFS_Capabilities version="2.0.0"
 xmlns="http://www.opengis.net/wfs/2.0"
 xmlns:wfs="http://www.opengis.net/wfs/2.0"
 xmlns:ows="http://www.opengis.net/ows/1.1"
 xmlns:ogc="http://www.opengis.net/ogc"
 xmlns:fes="http://www.opengis.net/fes/2.0"
 xmlns:gml="http://www.opengis.net/gml"
 xmlns:xlink="http://www.w3.org/1999/xlink"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd">
 <ows:ServiceIdentification>
    <ows:Title>WFS 2.0.0 TB12 used for security annotations</ows:Title>
    <ows:Abstract>Used to illustrate the use of security annotations using the ows:Constraint element</ows:Abstract>
    <ows:ServiceType codeSpace="http://www.opengeospatial.org/">WFS</ows:ServiceType>
    <ows:ServiceTypeVersion>2.0.0</ows:ServiceTypeVersion>
 </ows:ServiceIdentification>
 <ows:OperationsMetadata>
    <ows:Operation name="GetCapabilities">
      <ows:DCP>
        <ows:HTTP>
          <ows:Post xlink:href="http://cite.deegree.org/deegree-webservices-3.3.14/services/wfs200"/>
        </ows:HTTP>
      </ows:DCP>
      <ows:Parameter name="AcceptVersions">
        <ows:AllowedValues>
          <ows:Value>2.0.0</ows:Value>
        </ows:AllowedValues>
      </ows:Parameter>
      <ows:Parameter name="AcceptFormats">
        <ows:AllowedValues>
          <ows:Value>text/xml</ows:Value>
        </ows:AllowedValues>
      </ows:Parameter>
      <ows:Parameter name="Sections">
        <ows:AllowedValues>
          <ows:Value>ServiceIdentification</ows:Value>
          <ows:Value>ServiceProvider</ows:Value>
          <ows:Value>OperationsMetadata</ows:Value>
          <ows:Value>FeatureTypeList</ows:Value>
          <ows:Value>Filter_Capabilities</ows:Value>
        </ows:AllowedValues>
      </ows:Parameter>
    </ows:Operation>
    <ows:Operation name="GetFeature">
      <ows:DCP>
        <ows:HTTP>
          <ows:Post xlink:href="http://www.example.com/WFS">
            <ows:Constraint name="urn:ogc:def:tb12:security:authentication">
              <!--
                This annotation is equivalent to the one in WSDL as *this* annotation requires that the [[GetFeature]] *request*
                has a usernameToken included.
              -->
              <ows:ValuesReference ows:reference="http://www.example.com/WSDL.xml">#UsernameToken</ows:ValuesReference>
            </ows:Constraint>
            <ows:Constraint name="urn:ogc:def:tb12:security:confidentiality">
              <!--
                This annotation is incorrect and *not* equivalent to the one in WSDL as *this* annotation requires that the [[GetFeature]] *request*
 and *response*
                are encrypted. In the WSDL, only the [[GetFeature]] response is constrainted to be encrypted!
                And the use of this declaration potentially *will break* interoperability as it indicates that the [[GetFeature]] request message is
 to be encrypted.
                But the service is not expecting that, as according to the WSDL, only a digital signature is required on the request message!
              -->
              <ows:ValuesReference ows:reference="http://www.example.com/WSDL.xml">#Confidentiality</ows:ValuesReference>
            </ows:Constraint>
          </ows:Post>
        </ows:HTTP>
      </ows:DCP>
    </ows:Operation>
    <ows:Parameter name="version">
      <ows:AllowedValues>
        <ows:Value>2.0.0</ows:Value>
      </ows:AllowedValues>
    </ows:Parameter>
    <!-- Integrity Policy applies to the entire service (all operations) -->
    <ows:Constraint name="urn:ogc:def:tb12:security:integrity">
      <!--
        This annotation is equivalent to the one in WSDL as *this* annotation requires that the [[GetFeature]] *request*
        has a usernameToken included.
      -->
      <ows:ValuesReference ows:reference="http://www.example.com/WSDL.xml">#Integrity</ows:ValuesReference>
    </ows:Constraint>
    <!-- The normative eference a WS-Policy document is required as it ultimately defines the security constraints for the SOAP envelope -->
    <ows:Constraint name="urn:ogc:def:tb12:security:policy">
      <ows:ValuesReference ows:reference="http://www.example.com/ows/WS-Policy.xml"/>
    </ows:Constraint>
 </ows:OperationsMetadata>
</WFS_Capabilities>

Table: Capabilities with incorrect security annotations

3.8. Summary

Testbed-12 participants were successful in setting up services and clients under several regimes (SOAP 1.1 and 1.2, MTOM, etc.). Also, the security aspect has been addressed extensively. However, while SOAP on principle works with OGC Web Services there are several known issues which have been spotted for addressing (see list below).

List of issues spotted:

  • SOAP announcement via ServiceMetadata /OperationsMetadata

  • SOAP with encoding (binary, XML Schema, e.g. SOAP with attachment, inline base64 encoding, MTOM, …with XOP)

  • Errors a la SOAP 1.2: soap:Fault; ows:ExceptionReport (OWSCommon: use or rewrite)

  • Define a consistent mechanism for WSDL files

  • SOAP and conformance classes

  • recommendations on use of “action" attribute on application/soap+xml media type in HTTP header

  • Programmatic authentication (eg, during chaining)

  • Establish use of HTTP error codes like 302?

  • Forthcoming DGIWG requirements (announced, but not yet received)

  • SOAP 1.1 vs 1.2: OGC needs to make a decision

  • What will „fine-grain“ mean?