Hi Anish,
Thanks for the clarifications.
Anish Karmarkar wrote:
48DC3513.80602@oracle.com" type="cite">
Eric Johnson wrote:
48DC1D70.8030207@tibco.com" type="cite">
So far as I can tell, this looks great. I realize as I read it through
again, that I'm struggling with this one, to figure out the context:
"For messages that have multiple parts, the message uses “rpc” style,
as per section 3.5 of [WSDL11]. In this case, the child elements of the
SOAP Body element must be namespace qualified with a non-empty
namespace name. {I find this to be problematic. Unless one knows the
namespace, one cannot generate the correct messages on the wire. This
has to be nailed down. The options I see are: specify a generic NS
“http://docs.oasis-open.org/sca/binding/ws/YYYYMM”
or disallow messages
with multiple parts when defaulting. I'm leaning towards the latter.}"
Anish, could you remind us of what is going on here? I think this
relates to WS-I Basic Profile version 1.2, R1014 - http://www.ws-i.org/Profiles/BasicProfile-1_2(WGAD).html#SOAP_Body_Namespace_Qualification.
However, I cannot figure out exactly the dynamics of how one ends up
*without* namespace qualified elements under the body, and thus, how
this constraint comes into play. I have stared at WSDL and BP 1.2 for
quite some time, and am careening towards completely numbing my brain.
If you want to struggle with more wsdl/soap/addressing related
complexity, here is some more:
What is the relationship between:
1) SOAPAction HTTP header
2) action parameter on the SOAP 1.2 media type
3) wsa:Action WS-Addressing SOAP header block
4) wsaw:Action WS-Addressing WSDL extension attribute
5) soapAction WSDL SOAP 1.1 binding extension attribute
6) soapAction WSDL SOAP 1.2 binding extension attribute
7) soapActionRequired WSDL SOAP 1.2 binding extension attribute
Back to your question:
As you know there are four possible styles: rpc/literal, rpc/encoded,
doc/literal and doc/encoded. Lets stick to the two that are allowed by
WS-I BP: rpc/literal and doc/literal.
In doc/literal, the messages must have a single part (or no part) and
the part must point to a XML Schema element. The content of the SOAP
body is an instance of that XML Schema GED.
In rpc/literal, the message may contain > 1 part. The parts are
wrapped in another element, and it is this wrapper that is the child of
the SOAP body. The wrapper is a QName, whose local name is the same as
the operation name (for requests) and operation name + "Response" (for
responses). The namespace for the QName is the same as the value of the
namespace attribute of the <soapbind:body> element in WSDL. WS-I
BP 2717
(http://www.ws-i.org/Profiles/BasicProfile-1_2(WGAD).html#R2717)
say:
"An rpc-literal binding in a DESCRIPTION
MUST have the namespace attribute specified, the value of
which MUST be an absolute URI, on contained soapbind:body
elements."
This is really a corallary to R1014 that you point to. If the child
element of the SOAP body has to be namespace qualified then for
rpc/literal the namespace attribute on the <soapbind:body>
element must have a value. The root cause of all this is the fact that
in a rpc/literal binding the message parts refer to a XML Schema type
(not a GED) and the fact that the message can contain multiple parts
(WSDL 2.0 resolves this by allowing you to point only to a GED and
getting rid of parts inside a message). So when the type appears on the
wire, you have to say what the element name and the what the wrapper
name is.
In any case, if we want the binding.ws to specify exactly what happens
on the wire (which I would argue we do), then we have to say what the
value of the namespace attribute of <soapbind:body> element is,
for rpc/literal. If you don't specify the namespace, then the only
reasonable assumption would be that the wrapper is not namespace
qualified.
I hope this make it clear. If not, I can send some examples that make
it clearer.
Yes, this does make it clear - your suggestion for a namespace sounds
good to me.
48DC3513.80602@oracle.com" type="cite">
48DC1D70.8030207@tibco.com" type="cite">Unrelated,
while I was trying to re-learn the meaning of what I wrote
before, I tripped across this item in WS-I Basic Profile 1.2:
R2705 - A wsdl:binding in a DESCRIPTION MUST either be a
rpc-literal binding or a document-literal binding.
That is to say, BP 1.2 wants consistency for an entire binding, whereas
our bullet points below make a distinction based on the number of parts
in a given operation. We could change our criteria to say if *any*
operation has multiple parts, then then entire binding should be style
"rpc". That seems draconian to me, but does anyone else have thoughts
on the matter?
If we want to be BP compliant, and for the default binding I think it
makes sense to be BP compliant, then we would have to adopt this rule.
But it is slightly more complicated then that:
For rpc/lit: all parts must point to XML schema type
For dpc/lit: all parts must point to GEDs *and* must have either zero
or one part.
anything else would be an error.
Actually, I don't think we get to fail. If the customer has specified
a portType that violates the expected rules of WS-I BP 1.2, they may
have good reasons for doing so. So the reason that I put the rule the
way I did was precisely for this corner case - if a customer does use
elements instead of types, and ends up doing an rpc/lit binding, there
must still be a valid binding, even if it is not WS-I BP 1.2
compliant. This is another one of those reasons where we don't want to
be in the WSDL generation business, because we'd have to identify
another set of corner cases where the generated WSDL follows our spec,
but doesn't result in something WS-I BP compliant.
If you think this really is an error, is seems that the assembly
specification must state something normative about how interface.wsdl
portTypes cannot be any odd WSDL 1.1 portType, but they must be WS-I BP
1.2 compliant portTypes. But I don't think it should.
-Eric
|