- From: Anne Thomas Manes <anne@manes.net>
- Date: Mon, 09 Feb 2004 10:05:59 -0500
- To: "Rob Henley" <rob.henley@freeuk.com>, <www-ws@w3.org>
Rob,
The targetNamespace in the <wsdl:definitions> element creates a namespace
for all the elements that you define in the WSDL document (messages,
portTypes, bindings, services, and ports). Although the attribute is
optional, you should always create a namespace. The WS-I Basic Profile
makes this a required attribute.
The targetNamespace in the <xsd:schema> elements in the types section
creates a namespace for all the elements that you define in the schema
(elements, attributes, complexTypes, etc). This namespace may be the same
as the WSDL targetNamespace or it may be different. If you have plans to
use the schema definition in multiple services, it makes sense to create
different namespaces. If the schema definition will only be used by the one
Web service, then it makes sense to use just one namespace.
The <wsdl:definitions> targetNamespace does not in any way restrict imports
of other WSDL files. In fact, if you plan to import other WSDL files, its
more important to create a targetNamespace to allow you to distinguish
between the imported WSDL elements and those created in the WSDL file. When
you import a WSDL file, you also import that file's namespace -- which
should be different from the targetNamespace.
When using RPC style services, the SOAP runtime generates the RPC wrapper
element (the child element of the <soap:Body>). It derives the element's
local name from the operation name, and the namespace from the namespace
attribute on the <soap:body> definition. For example:
This binding definition:
<wsdl:operation name="foo">
<wsdl:input>
<soap:body use="literal" namespace="urn:foo-namespace" />
</wsdl:input>
Would produce:
<e:Body>
<m:foo xmlns:m="urn:foo-namespace">
...
The WSDL 1.1 and SOAP 1.1 specs don't specify what namespace the child
elements (the parameters) of the RPC wrapper element belong to. (These
elements are also generated by the SOAP runtime and aren't defined by any
schema.) The WS-I Basic Profile specifies that these elements should not be
namespace qualified -- they are local elements to the RPC wrapper element.
The child elements of these parameter elements are defined by a schema (in
the <types> section), so these elements belong to the namespace defined in
the <schema> targetNamespace.
If these is no targetNamespace defined on the <xsd:schema> element, then
the defined schema elements belong to no namespace. Likewise, if there is
no targetNamespace defined on the <wsdl:definitions> element, then the
defined wsdl elements beling to no namespace.
As a best practice, you should always define a targetNamespace.
Anne
At 03:55 AM 2/9/2004, Rob Henley wrote:
>Can anyone help me understand the use of the (optional) targetNamespace on
>the WSDL 1.1 defintions tag?
>
>The value can clearly be different from any targetNamespace(s) on schema
>elements in the types section., but is often the same in simple examples.
>
>One use for the targetNamespace at the defintions level seems to be to
>restrict imports of other WSDL files (they must all have the same
>targetNamespace). Other issues which occur to me are:
>
>- if I'm using rpc style then the outer level tag of a SOAP request is
>derived from the WSDL operation name (i.e. it isn't defined in Schema). Do
>these outer tags in the SOAP instance document belong to the namespace
>defined at the WSDL defintions level? (With their child elements
>potentially belonging to other namespaces as specified on WSDL schema
>elements?)
>
>- if there is no targetNamespace attribute on a WSDL schema element, does
>it default to the target namespace of the defintions element?
>
>- if there is no targetNamespace on the WSDL defintions element?
>
>Many thanks!
>Rob
~~~~~~~~~~~~~~~~~~
Anne Thomas Manes
VP & Research Director
Burton Group
Received on Monday, 9 February 2004 10:34:55 UTC