SAP PI HTTP Axis SOAPAction - SOAP webservice with multiple operations - Dynamic configuration - ActionNotSupported - web-services

I'm implementing this SAP PI scenario:
SOAP (SOAP UI) --- PO (7.5) --- SOAP (Third party webservice)
I'm getting this error in the response from a third party webservice:
ActionNotSupported: The message with Action '' cannot be processed at
the receiver, due to a ContractFilter mismatch at the
EndpointDispatcher. This may be because of either a contract mismatch
(mismatched Actions between sender and receiver) or a binding/security
mismatch between the sender and the receiver.  Check that sender and
receiver have the same contract and the same binding (including
security requirements, e.g. Message, Transport, None).
The problem is that I'm not sending the SOAPAction header to the third party webservice.
This scenario is implemented using the SOAP HTTP Axis receiver adapter because the third party webservice needed this kind of authentication.
Information:
The third party webservice has many operations.
The integrated configuration (Integration Builder) is implemented using a SOAP (HTTP) adapter sender and a SOAP (HTTP Axis) receiver.
I've configured the software component with one service interface (with many operations) and a dynamic configuration to dynamically write the SOAPAction header.
I'm following this tutorial: https://blogs.sap.com/2012/07/18/how-parameterized-mapping-udf-asma-dynamic-configuration-and-function-library-concepts-were-used-to-handle-multiple-operations-in-a-service/
The problem is that with the Axis adapter I don't have the ASMA option, so I don't know how to set the header like in the post. Moreover, SAP PI equally sends the header, but it gets empty in some parts of the process.
Where is PI deleting the value of SOAPAction?
Is there another way to solve this problem?
Technologies:
SAP PO 7.5
SOAP Webservices
PD: I can provide more images to clarify.

Related

Parameter traveling in SOAP

How does parameters in SOAP request is secure than Rest. I know SOAP wraps the message in an envelope and then send it to the web server but does it mean message is secure enough ? And if it is then what is the difference between SOAP envelope and Rest request body.
There are web service protocols for passing encrypted data - but you need to make sure it's supported by the relevant frameworks you use.
Note that it's not something that is part of default soap
REST web services are generally less "standard", and i'm not aware of a standard way to add encryption in rest (beyond transport level security like TLS or SSL)
any way, simply encrypting the parameters \ messages should be simple enough

How to turn off Envelope and Body in SOAP request

This is critical to my current project. I have written a client in C++ using Windows web services. This client talks to the Clickatell SMS SOAP web service. I have tested the request using the SOAPUI tool and get correct response. I also receive the SMS message. Now, when I do this programmatically it fails because the WsCall() [in the code generated from WSDL via wsutil.exe) inserts even though the SOAP request I have already includes Envelope and Body. I cannot take out my Envelope since I have namespace specified in it like this:
http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:tns=\"soap.clickatell.com\">
I know that the additional Envelope and Body are inserted since I see it in the Fiddler tool.
Any help I can get is highly appreciated!
Looks like you are using the older type rpc/encoded soap api.
Have you tried using the document/literal service?
(http://api.clickatell.com/soap/document_literal/webservice.php?wsdl)

two ways communication in web services

How can I have two ways communication with WS. Two ways means a client could be a server and a server could be a client. As far as I understand the problem related to the client-server model in HTTP which is used by WS. What is the best practice for this scenario when a server wants send an event to multiple clients without being polled. ?
As far as I know there are some solutions but I do not know which one is best
1) server-push techniques (websockets)
2) SOAP over JMS (this sounds great)
3) WS-eventing
Thanks
The purpose of a webservice is - as the name says - to serve. It responds to requests, but it never sends requests on its own (but an application accessed through a webservice interface could send requests to other webservices to fulfill a request sent to it).
When a component of a service-oriented architecture is supposed to receive events from another component, it means that the receiving component has to act as a server and expose an own web services interface so that the component where the event occured can call it.

XML Binding via Web Service (or JAXB)

I have to maintain a Java EE 5 web app.
A part of this app is the exchange of messages through web services (with WSDL contract).
The wsdl is used to generate the Java classes through the Eclipse wsdl2Java (I think it uses Axis)
Now I have to implement a modification where the server that we call via Web Service must be able to respond in an async way.
In fact the server will not respond immediately with the SOAP message response but, after a while, call a web service exposed by the client (our web app)
passing the SOAP Message response of the first call as a field (parameter) of this second Web service invocation.
The client then will save the SOAP response (or XML) in a file.
Is there a way to populate the already generated Java classes using this XML or SOAP message file? I mean a way to simulate the direct response of the server (feeding the Axis binding Stub)
I have also tried to use JAXB (to bind XML to JAVA) but since the SOAP message response is complex, when I call JAXBContext I receive an error:
CodPrestazione does not have a no-arg default constructor
since this class is an enum class generated by the wsdl2Java.
Is there a way to bypass this error without annotating or modifying the java class (this class is generated so I will be forced to modify this class at every re-generation)?
What is the best way to consume a saved SOAP message file(or XML)? Alternatively, how can I deserialize SOAP using Axis 1.3?

SOAP over JMS for starters

We have a web service which has been running on SOAP over HTTP using Apache CXF, and needs to be switched to SOAP over JMS. This is relatively new grounds for me and the internet didn't seem to give all the answers for me, or i couldn't understand much of it.
It would be really helpful if anyone of the experienced veterans explain the steps to get this conversion from HTTP ot JMS (in simple english which you guys do best) so that i could understand and implement it.
Also would like to get any info on checking if the SOAP over JMS is transparent (whether we could monitor the request & response).
Thanks in advance and cheers!!
The Internet can provide plenty of examples. Here is something to start:
SOAP over JMS by CXF and Advanced CXF configuration for JMS
The move from WS inbound call to JMS inbound message is quite transparent.
Simple high-level steps (in simple English to start with):
(a) Setup your JMS server
make sure it works by testing it - send messages to it using OpenJMS, Hermes, or some other client.
(b) In the CXF setup the connection to the JMS server and specific Queue
(c) Inbound messages: in your code, create an MDB (MessageDrivenBean) class, which is linked to the CXF connection setup
(d) Outboud messages: in your code, define a controller which uses the Context of CXF to get the connection and session to the JMS - and can send a message using them.
I'll be happy to hear how it goes.