Rechercher

Question
· Juin 24, 2019

Create a Pass-through SOAP WebService

Hi all,

I'm triying to create a SOAP Pass-through acording to Configuring Pass-through Business Services instructions, but I'm not able to run it sad

I'm using the following WebService

http://www.dneonline.com/calculator.asmx?wsdl

I've created both items

CalculatorSOAPCSPServ
  • Classname: EnsLib.SOAP.GenericService 
  • Target Config Name: CalculatorSOAPCSPOp
  • Port: Empty
  • Enable Standard Request: Checked
  • Pool size: 0
CalculatorSOAPCSPOp

 

Also, I've created the Web Application using the following parameters:

Name: /SOAPpassthrough

Dispatch Class: EnsLib.SOAP.GenericServer

 

If I ask directly the WSDL to Calculator WebService it retrives this XML:

http://www.dneonline.com/calculator.asmx?wsdl

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
      <s:element name="Add">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="intA" type="s:int" />
            <s:element minOccurs="1" maxOccurs="1" name="intB" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="AddResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="AddResult" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="Subtract">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="intA" type="s:int" />
            <s:element minOccurs="1" maxOccurs="1" name="intB" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="SubtractResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="SubtractResult" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="Multiply">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="intA" type="s:int" />
            <s:element minOccurs="1" maxOccurs="1" name="intB" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="MultiplyResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="MultiplyResult" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="Divide">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="intA" type="s:int" />
            <s:element minOccurs="1" maxOccurs="1" name="intB" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="DivideResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="DivideResult" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </wsdl:types>
  <wsdl:message name="AddSoapIn">
    <wsdl:part name="parameters" element="tns:Add" />
  </wsdl:message>
  <wsdl:message name="AddSoapOut">
    <wsdl:part name="parameters" element="tns:AddResponse" />
  </wsdl:message>
  <wsdl:message name="SubtractSoapIn">
    <wsdl:part name="parameters" element="tns:Subtract" />
  </wsdl:message>
  <wsdl:message name="SubtractSoapOut">
    <wsdl:part name="parameters" element="tns:SubtractResponse" />
  </wsdl:message>
  <wsdl:message name="MultiplySoapIn">
    <wsdl:part name="parameters" element="tns:Multiply" />
  </wsdl:message>
  <wsdl:message name="MultiplySoapOut">
    <wsdl:part name="parameters" element="tns:MultiplyResponse" />
  </wsdl:message>
  <wsdl:message name="DivideSoapIn">
    <wsdl:part name="parameters" element="tns:Divide" />
  </wsdl:message>
  <wsdl:message name="DivideSoapOut">
    <wsdl:part name="parameters" element="tns:DivideResponse" />
  </wsdl:message>
  <wsdl:portType name="CalculatorSoap">
    <wsdl:operation name="Add">
      <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Adds two integers. This is a test WebService. ©DNE Online</wsdl:documentation>
      <wsdl:input message="tns:AddSoapIn" />
      <wsdl:output message="tns:AddSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="Subtract">
      <wsdl:input message="tns:SubtractSoapIn" />
      <wsdl:output message="tns:SubtractSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="Multiply">
      <wsdl:input message="tns:MultiplySoapIn" />
      <wsdl:output message="tns:MultiplySoapOut" />
    </wsdl:operation>
    <wsdl:operation name="Divide">
      <wsdl:input message="tns:DivideSoapIn" />
      <wsdl:output message="tns:DivideSoapOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="CalculatorSoap" type="tns:CalculatorSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="Add">
      <soap:operation soapAction="http://tempuri.org/Add" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="Subtract">
      <soap:operation soapAction="http://tempuri.org/Subtract" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="Multiply">
      <soap:operation soapAction="http://tempuri.org/Multiply" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="Divide">
      <soap:operation soapAction="http://tempuri.org/Divide" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="CalculatorSoap12" type="tns:CalculatorSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="Add">
      <soap12:operation soapAction="http://tempuri.org/Add" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="Subtract">
      <soap12:operation soapAction="http://tempuri.org/Subtract" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="Multiply">
      <soap12:operation soapAction="http://tempuri.org/Multiply" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="Divide">
      <soap12:operation soapAction="http://tempuri.org/Divide" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="Calculator">
    <wsdl:port name="CalculatorSoap" binding="tns:CalculatorSoap">
      <soap:address location="http://www.dneonline.com/calculator.asmx" />
    </wsdl:port>
    <wsdl:port name="CalculatorSoap12" binding="tns:CalculatorSoap12">
      <soap12:address location="http://www.dneonline.com/calculator.asmx" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

 

However, If I'm using the passthrow SOAP it retrieves the following:

http://localhost:57772/SOAPpassthrough/CalculatorSOAPCSPServ/calculator....

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://tempuri.org" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="http://tempuri.org">
    <types/>
    <portType name="MyEnsembleRequestWebServiceSoap"/>
    <binding name="MyEnsembleRequestWebServiceSoap" type="s0:MyEnsembleRequestWebServiceSoap">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    </binding>
    <service name="MyEnsembleRequestWebService">
        <port name="MyEnsembleRequestWebServiceSoap" binding="s0:MyEnsembleRequestWebServiceSoap">
            <soap:address location="http://localhost:57772/SOAPpassthrough/CalculatorSOAPCSPServ/EnsLib.SOAP.GenericService.cls"/>
        </port>
    </service>
</definitions>

 

According to the documentacion, I should have the same result in both calls

What is wrong?

 

Best regards,

Francisco López

5 Comments
Discussion (5)4
Connectez-vous ou inscrivez-vous pour continuer
Annonce
· Juin 19, 2019

How to earn points on InterSystems Global Masters Advocate Hub

It’s no secret that the InterSystems Global Masters program is integrated with Developer Community, Open Exchange, and Ideas Portal. Whenever you contribute to any of these platforms, you automatically earn points and badges on Global Masters. 

We’ve created a short guide to help you discover the best ways to earn points on Global Masters:

Please note that points are automatically awarded on the 4th day after you make a contribution on DC, OEX, or the Ideas Portal (activities made outside of the Global Masters platform).

HOW TO EARN POINTS ON GLOBAL MASTERS

 Activity  Points  Badge(s)
Activities on Developer Community
👣 First Steps
Register on Developer Community 50  
First article 1500 DC Author
First question 500 InterSystems Researcher
First comment or answer 300 DC Commenter
Certified Specialist badge 200  
📑 Articles on Developer Community
Each published post on Developer Community 200  
Published post on DC in Chinese 400  
Published post on DC in Spanish 400  
Published post on DC in French 400  
Published post on DC in Japanese 400  
Published post on DC in Portuguese 400  
5 Articles on DC 7500 Reporter
10 Articles on DC 15000 Blogger
25 Articles on DC 40000 Influencer
50 Articles on DC 75000 Opinion Maker
💬Comments on Developer Community
Each comment on the Developer Community 30  
Comment on DC in Chinese 60  
Comment on DC in Spanish 60  
Comment on DC in French 60  
Comment on DC in Japanese 60  
Comment on DC in Portuguese 60  
Accepted answer on Developer Community 150  
Questions
5 Questions on DC 2000 Curious Member
10 Questions on DC 5000 Thorough Member
25 Questions on DC 15000 Inquisitive Member
50 Questions on DC 30000 Socratic Member
🙋‍♂️Answers
1 Accepted Answer 1000 DC Problem Solver
5 Accepted Answers 4000 Master of Answers
10 Accepted Answers 8000 Bronze Master of Answers
25 Accepted Answers 20000 Silver Master of Answers
50 Accepted Answers 40000 Gold Master of Answers

If you would like to learn about our special set of badges and additional points for a number of Accepted Answers on the Developer Community!

🌐Translations of the DC Articles

Translate an article
Read how to translate Articles here. 
150
  • DC Translator — 1 completion
  • Advances — 5 completions
  • Bronze — 15 completions
  • Silver — 25 completions
  • Gold — 50 completions
Translate a question 30  
🌟Best Practices
1 Best Practices Article 500 Best Practices Author
2 Best Practices Articles 1500 Advanced Best Practices Author
3 Best Practices Articles 3500 Bronze Best Practices Author
4 Best Practices Articles 5000 Silver Best Practices Author
5 Best Practices Articles 7500 Gold Best Practices Author
👀 Post Views (on your post)
750 Views on DC Post 200 Popular Writer
2000 Views on DC Post 500 Notable Writer
5000 Views on DC Post 1000 Famous Writer
15000 Views on DC Post 3000 Gold Writer
👍 Likes (on your posts)
50 Likes on DC Posts 500 Insightful Author
100 Likes on DC Posts 1000 Expert Author
500 Likes on DC Posts 5000 Recognizable Author
1000 Likes on DC Posts 10000 Powerful Author
Activities on Open Exchange
💿Downloads of Your Application
50 Downloads on OEX App 500 Popular App
100 Downloads on OEX App 1000 Bronze Popular App
250 Downloads on OEX App 2500 Silver Popular App
500 Downloads on OEX App 5000 Gold Popular App
🧑‍💻Applications
Each App on Open Exchange 800  
IPM application on Open Exchange 400  
1 App on OEX 1000 Open Exchange Developer
5 Apps on OEX 10000 Bronze Open Exchange Developer
10 Apps on OEX 25000 Silver Open Exchange Developer
25 Apps on OEX 50000 Gold Open Exchange Developer
📝OEX Reviews
Each Open Exchange Review 200  
1 OEX Review 200 Open Exchange Reviewer
5 OEX Reviews 500 Advanced Open Exchange Reviewer
10 OEX Reviews 1000 Bronze Open Exchange Reviewer
25 OEX Reviews 2500 Silver Open Exchange Reviewer
50 OEX Reviews 5000 Gold Open Exchange Reviewer
Activities on Ideas Portal
💡Product Ideas Submission

Product Idea Submitted

Points are awarded automatically for ideas submitted under the "InterSystems Products" category, after the idea has passed moderation. Read more in this post.

100
  • Idea Creator — 1 idea
  • Advanced — 5 ideas
  • Bronze — 10 ideas
  • Silver — 25 ideas
  • Gold — 50 ideas
Product Idea In Progress 500  
Product Idea Implemented 3000  

Complete challenges, get badges and climb up the levels: Insider > Advocate > Specialist > Expert >Ambassador> Legend.*
*Please note the level system is not available on a new Global Masters platform starting from April 2024. We are working on bringing it back!

The higher level you are, the more interesting prizes available!

And...

Please check the additional information about Global Masters:

Additionally, you can join our Referral Program here and earn 1,000 points for each friend who joined Developer Community!

If you have not joined InterSystems Global Masters Advocacy Hub yet, let's get started right now! yes

Feel free to ask your questions in the comments to this post.


*Post last updated: 21 July 2025

1 nouveau commentaire
Discussion (42)12
Connectez-vous ou inscrivez-vous pour continuer
Question
· Juin 10, 2019

How to generate a pdf file from an XLFO in Ensemble

In my production I receive an  XLFO stream and I would like to pass that to the FOP pdf rendering engine to produce pdf files .So far in my research that can be achieved through ZEN .I would like to create an operation that will take advantage of that and be able to pass my XLFO stream  to the operation and create pdf files I found something similar  here but for some reasons I get errors like below if any one understands what they mean please advice or someone  who had to do something similar advice on how to achieve this thanks in advance

 

0Error rendering: OS code=1 Use $LOG=1 to check•
ENSEMBLE†2e^zrenderDirectStatus+2^%SYS.ZENReportServer.1^1/e^%ServeTransform+48^%SYS.ZENReportServer.1^12e^%PerformTransform+1^%ZEN.Report.reportPage.1^1.e^%DisplayPDF1+19^%ZEN.Report.reportPage.1^1,e^%DisplayPDF+7^%ZEN.Report.reportPage.1^1-e^zCallReport+33^%ZEN.Report.reportPage.1^10e^zGenerateReport+4^%ZEN.Report.reportPage.1^14e^zTestFO2PDFFromMethod+5^ZEN.Report.FOWrapper.1^1e^^^0
2 Comments
Discussion (2)1
Connectez-vous ou inscrivez-vous pour continuer
Article
· Mai 29, 2019 1m de lecture

Simple Remote Server Control

This example is extracted from a long-running installation.
The purpose is to have simple monitoring of several servers at a rather primitive level.
Just slightly more intelligent than a raw PING. But still easy to integrate.
It avoids the overkill of information you are often confronted with while you are just
interested in the number of active processes or similar basic figures.
The example shows a basic skeleton that might be easily filled by your real needs.

It consists of 3 sections:

  • the data section to hold server access data
  • the server section to run unattended at the server you want to monitor
  • the client section that is just for demonstration and should be integrated by your code into your environment.

Operation is simple:

the server starts and listens for requests.

from client, various inquiries go to server and get replied.

The whole example is kept very simple and it is your task to add what you require
and to adapt the client section to your needs and for your environment.

GitHub

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer
Article
· Mai 23, 2019 9m de lecture

PHP module for working with hierarchical data in InterSystems IRIS

PHP, from the beginning of its time, is renowned (and criticized) for supporting integration with a lot of libraries, as well as with almost all the DB existing on the market. However, for some mysterious reasons, it did not support hierarchical databases on the globals.

Globals are structures for storing hierarchical information. They are somewhat similar to key-value database with the only difference being that the key can be multi-level:


Set ^inn("1234567890", "city") = "Moscow"
Set ^inn("1234567890", "city", "street") = "Req Square"
Set ^inn("1234567890", "city", "street", "house") = 1
Set ^inn("1234567890", "year") = 1970
Set ^inn("1234567890", "name", "first") = "Vladimir"
Set ^inn("1234567890", "name", "last") = "Ivanov"

In this example, multi-level information is saved in the global ^inn using the built-in ObjectScript language. Global ^inn is stored on the hard drive (this is indicated by the “^” sign in beginning).

In order to work with globals from PHP, we will need new functions that will be added by the PHP module, which will be discussed below.

Globals support many functions for working with hierarchies: traversal tree on fixed level and in depth, deleting, copying and pasting entire trees and individual nodes. And also ACID transactions - as is done in any quality database. All this happens extremely quickly (about 105-106 inserts per second on regular PC) for two reasons:

 

  1. Globals are a lower level abstraction when compared to SQL,
  2. The bases have been in production on the globals for decades, and during this time they were polished and their code was thoroughly optimized.

Learn more about globals in the series of articles titled "Globals Are Magic Swords For Managing Data.":

Part 1.
Trees. Part 2.
Sparse arrays. Part 3.

In this world, globals are primarily used in storage systems for unstructured and sparse information, such as: medical, personal data, banking, etc.

I love PHP (and I use it in my development work), and I wanted to play around with globals. There was no PHP module for IRIS and Caché. I contacted InterSystems and asked them to create it. InterSystems sponsored the development as part of an educational grant and my graduate student and I created the module.

Generally speaking, InterSystems IRIS is a multi-model DBMS, and that's why from PHP you can work with it via ODBC using SQL, but I was interested in globals, and there was no such connector.

So, the module is available for PHP 7.x (was tested for 7.0-7.2). Currently it can only work with InterSystems IRIS and Caché installed on the same host.

Module page on OpenExchange (a directory of projects and add-ons for developers at InterSystems IRIS and Caché).

There is a useful DISCUSS section where people share their related experiences.

Download here:

https://github.com/intersystems-community/php_ext_iris

Download the repository from the command line:

git clone https://github.com/intersystems-community/php_ext_iris

 

Installation instructions for the module in English and Russian.

Module Functions:

PHP function Description
Working with data
iris_set($node, value)
 
Setting a node value.
iris_get($node)
 
Getting a node value.
iris_zkill($node)
 
Deleting a node value.
iris_kill($node)
 
Deleting a node and all descendant branches.
iris_order($node)
 
Traversal the branches of the global on a given level
iris_order_rev($node)
 
Traversal the branches of the global on a given level in reverse order
iris_query($CmdLine)
 
Traversal of the global in depth
Service functions
iris_set_dir($FullPath)
 
Setting up a directory with a database
iris_exec($CmdLine)
 
Execute database command
iris_connect($login, $pass) Connect to database
iris_quit() Close connection with DB
iris_errno() Get error code
iris_error() Get text description of error

 

 
If you want to play around with the module, check e.g. docker container implementation
 

Especially for DC and those who wants to use we run a virtual machine with a Caché php-module was set up.

 
For self-installation of the module for InterSystems Caché

Just out of interest, I ran two primitive tests to check the speed of inserting new values into the database in the docker container on my PC (AMD FX-9370@4700Mhz 32GB, LVM, SATA SSD).

  • Insertion of 1 million new nodes into the global took 1.81 seconds or 552K inserts per second.
  • Updating a value in the same global 1,000,000 times took 1.98 seconds or 505K updates per second. An interesting fact is that the insertion occurs faster than the update. Apparently this is a consequence of the initial optimization of the database aimed at quick insertion.

Obviously, these tests cannot be considered 100% accurate or useful, since they are primitive and are done in the container. On more powerful hardware with a disk system on a PCIe SSD, tens of millions of inserts per second can be achieved.

What else can be completed and the current state

  1. Useful functions for working with transactions can be added (you can still use them with iris_exec).
  2. The function of returning the whole global structure is not implemented, so as not to traverse the global from PHP.
  3. The function of saving a PHP array as a subtree is not implemented.
  4. Access to local database variables is not implemented. Only using iris_exec, although it's better with iris_set.
  5. Global traversal in depth in the opposite direction is not implemented.
  6. Access to the database via an object using methods (similar to current functions) is not implemented.

The current module is not quite yet ready for production: not tested for high loads and memory leaks. However, should someone need it, please feel free to contact me at any time (Sergey Kamenev sukamenev@gmail.com).

Bottom line

For a long time, the worlds of PHP and hierarchical databases on globals practically did not overlap, although globals provide strong and fast functionality for specific data types (medical, personal).

I hope that this module will motivate PHP programmers to experiment with globals and ObjectScript programmers for simple development of web interfaces in PHP.

P.S. Thank you for your time!

1 Comment
Discussion (1)2
Connectez-vous ou inscrivez-vous pour continuer