Интуиция меня не подвела. Решение и правда было в http-обработчиках.
Обработчик моего сервиса в SICF был CL_SOAP_HTTP_EXTENSION in /default_host/sap/bc/srt/rfc. Я так и не понял как его использовать для удержания сессии.
Но я понял, как это сделать для обработчика CL_HTTP_EXT_SOAPHANDLER_RFC.
В нем используется переменная session_mode из http-запроса:
Code:
server->request->get_form_field( name = 'session_mode' )
Необходимо использовать session_mode = 1 в первом вызове веб-сервиса. Сессия откроется.
Code:
If session_mode = 1.
server->stateful = server->co_enabled.
server->response->set_cookie ... 'sap-contextid' ...
В последнем вызове добавляю session_mode = 2. Сессия закрывается (проверено в SM04).
Code:
If session_mode = 2.
server->stateful = server->co_disabled.
server->response->delete_cookie_at_client ... 'sap-contextid' ...
Я сделал копию - ZCL_HTTP_EXT_SOAPHANDLER_RFC. И добавил возможность чтения параметра session_mode из http-заголовка, мне так удобнее.
Code:
server->request->get_header_field( 'session_mode' )
В SICF я создал сервис /default_host/zmysoap и добавил туда мой Z обработчик. В wsdl-файле изменил soap:address на
http://<host:port>/mysoap. Все работает.