The plot thickens...after poking around in the source, I found where the AxisServlet stores the SOAPAction value:

org.apache.axis.transport.http.AxisServlet.java, line 835:

soapAction = getSoapAction(req);

    if (soapAction != null) {
        msgContext.setUseSOAPAction(true);
        msgContext.setSOAPActionURI(soapAction);
    }

Here, the MessageContext stores the SOAPAction value, but I don't see it being used for message delivery anywhere. The service operation name is set in org.apache.axis.providers.java.RPCProvider.java, line 194:

operation = msgContext.getOperation();

        if (operation == null) {
            QName qname = new QName(body.getNamespaceURI(),
                    body.getName());
            operation = serviceDesc.getOperationByElementQName(qname);
        }

But RPCProvider doesn't call MessageContext.useSOAPAction, and MessageContext.getOperation doesn't check SOAPAction either. It seems like that last bit should be something like this:

        if (msgContext.useSOAPAction()) {
           String soapAction = msgContext.getSOAPActionURI();
           QName qname = new QName(...) // parse soapAction into URI and name
           operation = serviceDesc.getOperationByElementQName(qname);
        }
        else {
          operation = msgContext.getOperation();

          if (operation == null) {
              QName qname = new QName(body.getNamespaceURI(),
                      body.getName());
              operation = serviceDesc.getOperationByElementQName(qname);
          }
        }

Bug, or works-as-designed? I'll take a closer look next week when I have more time (or less sleep, or more coffee, or...)

Mike


Michael Woinoski wrote:


Keith,

I agree with all of your points.

I dont understand web services well enough yet so this question may be a
lame one.

The SOAPAction is in the WSDL. How does that translate to the actual
SOAP message that is being sent over the wire?


The soapAction attribute value in the WSDL is the value the client should assign to the SOAPAction HTTP header in the request message. So it's set by the client, not the service.

My uneducated guess is
that it doesn't. My guess is that the server is suppose to know the
given "soap action" when it receives a given "message". Is that
correct or is there something more specific in the SOAP message that
tells the "soap action"?
I also thought I read somewhere that soapAction in the WSDL was not
suppose to be used.


I don't remember seeing that SOAPAction shouldn't be used. Basic Profile says "SOAPAction is purely a hint to processors. All vital information regarding the intent of a message is carried in soap:Envelope." Now exactly what "intent" means, I don't know. Does "intent" include "ultimate destination of message"? Beats me.

I may be wrong about that. At this point I have too
much reading in my small brain to keep it all straight.


Ah yes, that bursting skull sensation...

Mike


Keith


-----Original Message-----
From: Michael Woinoski [mailto:[EMAIL PROTECTED] Sent: Thursday, November 13, 2003 5:48 PM
To: [EMAIL PROTECTED]
Subject: Re: How to define document/literal service with multiple
operations


Keith,


With document/literal web services you need to define your schema in
such a way that the "wrapper" element or root element will lead you to
the business function. So you are not just defining the data that


needs

to be sent but also a wrapper element that suggests the operation to


be

performed.



Well, that may be the way Axis currently routes messages, but I prefer
to develop my application's schema based on what is appropriate for the application, not because of the limitations imposed by a particular implementation. This is exactly the kind of situation that SOAPAction is


supposed to address. .NET uses it for routing messages, so I know Axis
HAS to support it ;-) I suspect it's just a matter of configuring
HTTPActionHandler correctly.

Also, I'd like to keep my web services portable to different JAX-RPC implementations, so I try to avoid Axis-specific features (e.g.,
Message-style services.)



Read the axis users guide about "service styles"
specifically the "message", "document" and "wrapped" service styles.



I did. I didn't find anything in the user's guide about the details of routing document-style services.

Regards,
Mike


-----Original Message-----
From: Michael Woinoski [mailto:[EMAIL PROTECTED] Sent: Thursday, November 13, 2003 4:47 PM
To: Axis User mailing list
Subject: How to define document/literal service with multiple


operations

How can I define a document/literal service with multiple operations?
Because there's no wrapper element around the input message parts, Axis seems


to

have a problem invoking the correct service method.

If I add a value for SOAPAction in the service's binding, the client
stubs set SOAPAction in the HTTP request correctly, but Axis doesn't use the
SOAPAction value. I found the Axis HTTPActionHandler class and tried adding it to
the request flow in the service's deploy.wsdd but it didn't seem to make a



difference. Does Axis support this? If so, how do I configure it?

Thanks,
Mike





--


Mike Woinoski                      Pine Needle Consulting
mailto:[EMAIL PROTECTED]



Reply via email to