- From: Doug Davis <dug@us.ibm.com>
- Date: Fri, 27 Jul 2001 07:54:43 -0400
- To: Glen Daniels <gdaniels@macromedia.com>
- Cc: "'xml-dist-app@w3.org'" <xml-dist-app@w3.org>
If the req/res header is only serialized "when needed",and in the
example you gave it is not needed for single hop HTTP, how can
the sender know whether the message is going directly to the final
node or through some intermediaries? It seems like it might end
up being there all the time (I'm not implying that that is a bad
thing - just making an observation).
-Dug
Glen Daniels <gdaniels@macromedia.com>@w3.org on 07/26/2001 01:54:23 PM
Sent by: xml-dist-app-request@w3.org
To: "'xml-dist-app@w3.org'" <xml-dist-app@w3.org>
cc:
Subject: TBTF: A distillation of sorts
Here's a quick summary of some recent thoughts re: bindings and
extensions and blocks ("oh my" :)).
* We can pick operational semantics and define them in terms of named
components, pieces of data, and communication patterns. This is the
basis of our extension framework in general. I.e. "this custom
security extension (named 'http://myhost/cheesy-security') is implemented
by sending a block (ns = 'http://myhost/cheesy-security', name = 'user')
containing a username encoded as a string....' etc.
* Typically extensions are realized by a process of serializing one or
more SOAP blocks in messages on the wire in accordance with the
contracts defined by the extension specifications. However, these
blocks may be thought of as simply existing in the message "infoset",
and some or all of them may not actually require an explicit
serialization on the wire.
* The process by which we define these "extensions" is precisely the
same process by which we can define binding "facets".
* Any SOAP processor may choose to implement the semantics of particular
extensions/facets in any way which satisfies the contracts of those
extensions/facets - and in particular, if the processor (or a component
thereof) has knowledge of a particular extension/facet, it may do one of
two "special" sorts of operations:
1. It may choose NOT to serialize particular blocks, since the
information they convey may be implicit in the communications
link to the next node, or may be pre-specified somehow by
out-of-band metadata.
2. It may choose to ASSUME the existence of particular blocks, again
based on the particulars of the implementation or underlying
protocol.
* Any component (and specifically bindings) may define any kind of
semantics/extensions that it desires, and in fact does NOT need to
represent all such semantics as named extensions/facets. However, if we
wish an extension to be understood by other layers or implementable by
other bindings, we should give it a unique name, write a specification,
and perhaps define a normative XML serialization of the blocks which
are involved. Giving it a name allows other entities, both human and
machine, to refer uniquely to the extension or block in question.
--- An example which might make this a little clearer ---
1. Define a "request-response" message pattern, called:
http://www.w3.org/2001/07/req-resp
The spec states that any request message which uses this MEP must
contain a "ns:RequestID" block (where ns == the req-resp URI) which
itself contains a string. When a response (or a fault) is generated
as a result of any such message, a "ns:ResponseID" block containing
exactly the same information in the RequestID block must be included
in said response.
2. The normative HTTP binding states something like:
"This binding handles request-response correlation for message
pattern http://www.w3.org/2001/07/req-resp implicitly. Therefore
when using this binding to carry request messages which follow
said pattern, implementations may omit the serialized form of the
requestID/responseID blocks on the wire, and rely on the fact that
the semantics of the blocks will be satisfied by the binding itself."
3. One can imagine a "req/resp" module being responsible for adding
an appropriate RequestID block to outgoing requests, and handling
the actual correlation (perhaps waking threads, etc) of responses
based on ResponseID. So a particular implementation of this might
look like this for a typical RPC call:
client -[1]-> req/resp extension -[2]-> HTTP binding -[3]-> {(net)}
The message "infoset" at [1] contains only the structured RPC
request. At [2], the message now has a 'virtual' RequestID block
as well (not necessarily serialized). But when it gets to [3], the
serialization of the message does not contain the RequestID block.
When the response comes back from the HTTP binding up through the
req/resp extension, the binding ensures the "ResponseID" block is
placed correctly into any response which was received over the
HTTP connection (and note again that the ResponseID block is not
necessarily actually represented in the message, it might exist
in a contextual data structure, or might in fact be implicit
based on the thread which blocked when calling the HTTP binding).
4. A UDP binding which is later written doesn't state anything about
its relationship to this message exchange pattern, and therefore
the RequestID/ResponseID blocks will be serialized across the UDP
connection.
Couple of quick notes about this example (which was written up before
Chris' example went out):
I'm not promoting this particular set of definitions, this is just a
toss-off model. If we really go this route, it probably makes sense
to not tie the correlation ID blocks so tightly to the message pattern,
for instance.
This example assumes a single hop between the requestor and the
responder. If intermediaries were involved and round-trip correlation
was required (which is a case I think we need to deal with), the HTTP
binding wouldn't be able to implicitly remove the correlation ID.
- * -
In any case, there you have it - I hope this made some sense, despite
the fact that the thoughts herein are merely explorations in a
particular direction, and somewhat imprecisely expressed.
Glen Daniels
Macromedia
http://www.macromedia.com/
Building cool stuff for web developers
Received on Friday, 27 July 2001 07:54:46 UTC