- From: <noah_mendelsohn@us.ibm.com>
- Date: Mon, 6 Mar 2006 08:47:17 -0500
- To: Christopher B Ferris <chrisfer@us.ibm.com>
- Cc: xml-dist-app@w3.org
Chris: I agree with a lot of what you've written, though not quite all. Points of agreement: * mustUnderstand processing may result in a fault before you are in a position to get any reliable information from the headers. Though you didn't quite say it this way, I think we are both agreeing that therefore the headers cannot in general be used to select between MEPs, at least not between MEPs that would affect the routing of such faults. I think this is an important point that's easily forgotten, and the reminder was very helpful to me during the call (and perhaps to others too). * Always, or almost always, if a binding supports more than one MEP, then the one in use will have to be discoverable from information in the non-envelope part of the transmission. (There might be exceptions in the case of two MEPs that were so similar that the distinction was only pertinent after processing was done, e.g. if they happened to share rules for request fault routing.) * While we don't quite agree that supporting multiple MEPs is in all cases impractical, I agreed in the meeting that it's only occasionally workable. In particular, I agree that the proposed one-way FAF MEP would not coexist with the others already supported by HTTP, even if it could be well implemented on HTTP in principle (I believe it can't anyway, so coexistence isn't the first problem with it.) Chris Ferris wrote: > In the case of the SOAP Response MEP, the fact that you use a > different HTTP method (GET), and you serialize the request such that > there is no SOAP envelope infoset in the entity body I think makes it > a different binding. Here's where I think I have a significant disagreement. My understanding, and certainly my intention when we voted to create the formal concept of a "binding", is that it is ultimately a specification and a point of conformance. While it would be coherent to write two different HTTP bindings, one for R-O-R and one for Response-only, that's not what we did. Accordingly, IMO, a conforming implementation of our binding MUST support both, and therefore must support both GET and POST. Now, in practice, I've always taken the position that people shouldn't have to write code that will never be invoked. If you really know that you're deploying resources that will only be accessible in one style or the other, or if you're writing a client where you're really sure that none of the endpoints you'd access would support GET anyway, then there's a case to be made for skipping the implementation of the code you'd never use. That said, if a given piece of code is advertised as supporting the current HTTP SOAP 1.2 binding then I believe it should support both. As importantly, if another specification were to mandate use of our HTTP binding, it would be reasonable for that specification to presume the availability of both MEPs and both WebMethods. That's a useful characteristic of the specification, albeit one that most current implementations have made difficult to exploit :-(. > In the case where one defines a binding and says that it supports a > given MEP, I don't believe that you can simply overlay another MEP > if it requires that the rules for the binding be changed to accomodate it. I agree that this is only occasionally possible. In general, one can't compose arbitrary MEPs in the same binding. I do think one can get value out of supporting more than one MEP in the more rare occasions where you can indeed support the two correctly. Also, I think you only get value out of doing this in cases where you expect that yet another binding might support one but not the other. For example, we could imagine that our HTTP binding supports R-O-R and ReqOnly, as it does today, and XMPP might support just R-O-R. Now you've correctly modeled for applications that the two are quite interchangeable for R-O-R, but you have not obligated XMLP to support Response-only. > when you are using this MEP, do this with the underlying > transport/transfer and when you use this other MEP, do something > different; something that will inform the binding at the other end > that you are using a different MEP. I would expect that in a language like Java, you would have very roughly: interface Request-Optional-Response { void sendRequest(URI u, msg m); msg waitAndReceiveResponse(); } interface Response-Only { msg = getRepresentationEnvelope(URI u); } class HTTPBindingImplementat implements Request-Optional-Response, Response-only { sendRequest(URI u, msg m) { hMsg = new OutboundHTTPMessage(); // this line shows where the switch is set hMsg.Metbod = "POST"; ... } .. getRepresentationEnvelope(URI u) { hMsg = new OutboundHTTPMessage(); // this line shows where the switch is set hMsg.Metbod = "GET"; ... } } class XMLPP BindingImplementat implements Request-Optional-Response { sendRequest(URI u, msg m) { xMsg = new OutboundXMPPMessage(); ...No need to set switch here, because only one MEP supported { } The above is rough pseudocode, but I think it makes clear that it's the binding implementation that realizes the MEP, and that leaves markers in the transport-level message if MEP control is needed. -------------------------------------- Noah Mendelsohn IBM Corporation One Rogers Street Cambridge, MA 02142 1-617-693-4036 -------------------------------------- Christopher B Ferris <chrisfer@us.ibm.com> Sent by: xml-dist-app-request@w3.org 03/04/2006 08:07 AM To: xml-dist-app@w3.org cc: (bcc: Noah Mendelsohn/Cambridge/IBM) Subject: multiple MEPs per binding Noah wrote in IRC: [07:02] noah: I'm afraid I disagree with Chris on the multiple MEPs/binding. I think they're in the spirit of Java interfaces. Saying that one binding can do multiple MEPs and keep them straight, lets you capture the mix n match between capabilities shared and not shared by different transports With all due respect to Noah's point, I'm not sure that I agree. Now, I will concede up-front that Noah may well have thought this through more thoroughly than I, and he may have concrete examples of cases where it is not necessarily the case that the problems and distinctions I cite below would be evident were one to overlay two or more MEPs over a single binding. I am certainly open to hearing more of what Noah has to say on the matter. I will also concede that I may be making too-fine a distinction here. Consider the SOAP Response, Request-Response and (the as-yet undefined) One-way MEPs. One might claim that a SOAP/HTTP can theoretically support them all. However, I would argue that this may not be the case. Consider that R-O-R says that if a fault is generated, send it on the response channel corresponding to that on which the message that generated the fault was received. Thus, even if there were a WSA response endpoint(s) which explicitly said: send the response and/or faults over here instead of on the response channel, because a SOAP mU (or VersionMismatch) fault MUST be generated before any other processing of the message is performed, and because the SOAP processor MUST NOT perform any other processing on that message (other than that necessary to deliver the fault), there is ALWAYS the chance that there will be a SOAP envelope transmitted on the response channel of an HTTP request. One cannot assume that the SOAP processor, written to the SOAP1.2 spec will ever even consider the WSA header blocks as being more than QNames to check against a table of supported QNames for the role that the node operates under. If you had a one-way MEP that said: you send a SOAP message and get no SOAP response (let's leave FAF out of it for the time being) and claimed that HTTP supported this MEP, then unless you have included some explicit hint at the HTTP level (not the SOAP level) that said: under no circumstances can you include a SOAP envelope in the HTTP response, that the sending endpoint MUST, regardless of what MEP were in play, be prepared to receive a SOAP envelope in the HTTP response. In the case of the SOAP Response MEP, the fact that you use a different HTTP method (GET), and you serialize the request such that there is no SOAP envelope infoset in the entity body I think makes it a different binding. The rules are different for this MEP than for R-O-R. Hence, if you were to try to layer multiple interfaces ala Java over the binding, unless you actually change the binding (and by that, I mean that you do something different at the binding layer for one MEP that you don't do for another) then you may be in for a nasty surprise. In the case where one defines a binding and says that it supports a given MEP, I don't believe that you can simply overlay another MEP if it requires that the rules for the binding be changed to accomodate it. I would argue that by doing something different in the binding, outside the SOAP envelope, that in fact, you have a different binding. The fact that the protocol used was the same is not material. The fact that the rules used to serialize the message for that binding are different for the two MEPs, I believe, makes it a different binding. Now, I will agree that you can certainly layer an interface over the API that implements the underlying transport (HTTP) but IMO, what you have to have is something specific that says: when you are using this MEP, do this with the underlying transport/transfer and when you use this other MEP, do something different; something that will inform the binding at the other end that you are using a different MEP. Could that be captured in the binding? Yes, I suppose, especially in the case where the binding is initially defined such that it supports a set of MEPs. However, I don't think that it is safe to assume that you can do this as a general rule of thumb. Cheers, Christopher Ferris STSM, Software Group Standards Strategy email: chrisfer@us.ibm.com blog: http://www.ibm.com/developerworks/blogs/dw_blog.jspa?blog=440 phone: +1 508 377 9295
Received on Monday, 6 March 2006 13:47:27 UTC