- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们需要能够从 iSeries LPAR (V6R1) 上运行的 COBOL 代码调用内部 Web 服务。我完成了一个可以在网上找到的完整示例 here .因此,我的下一步是尝试重复该过程并调用我们现有的网络服务之一。
我使用 QSH 的 WSDL2WS 命令生成 C 客户端 stub 。我修改了示例 COBOL 客户端程序并尝试调用我的 Web 服务。我遇到的问题似乎与示例 C 客户端方法返回指针并且 COBOL 代码将它们分配给指针这一事实有关。我怀疑我的 COBOL 代码中的错误是问题的根源,因为 WSDL2WS 为我的 Web 服务方法创建的 C 方法返回一个简单的 xsdc_string 而不是指向自定义结果类型的指针:
xsdc__string TestUnsuccessfulMessage(AXISCHANDLE stub)
{
AXISCHANDLE call = axiscStubGetCall(stub);
xsdc__string Ret = NULL;
axiscCallSetSoapFaultNamespace(call, "http://myserver/PSItemMaintenance/ItemMaintenanceService.svc");
// ======================================================================
// Initialize client engine, set SOAP version, SOAPAction, operation, etc.
// ======================================================================
if (AXISC_SUCCESS != axiscCallInitialize(call, C_DOC_PROVIDER ))
return Ret;
if (NULL==axiscCallGetTransportProperty(call,"SOAPAction",0))
axiscCallSetTransportProperty(call,AXISC_SOAPACTION_HEADER , "http://tempuri.org/IItemMaintenanceService/TestUnsuccessfulMessage");
axiscCallSetSOAPVersion(call, SOAP_VER_1_1);
axiscCallSetOperation(call, "TestUnsuccessfulMessage", "http://tempuri.org/");
// ======================================================================
// Apply SSL configuration properties and user-set SOAP headers.
// ======================================================================
axiscStubIncludeSecure(stub);
axiscStubApplyUserPreferences(stub);
// ======================================================================
// Invoke web service, send/receive operation. Handle output parameters, if any.
// ======================================================================
if (AXISC_SUCCESS == axiscCallSendAndReceive(call))
{
if(AXISC_SUCCESS == axiscCallValidateMessage(call, "TestUnsuccessfulMessageResponse", "http://tempuri.org/", true_))
{
Ret = axiscCallGetElementAsString(call, "TestUnsuccessfulMessageResult", 0);
}
axiscStubCheckForExtraneousElements(stub);
}
axiscCallUnInitialize(call);
return Ret;
}
我可以在 Debug模式下设置 Web 服务,并且可以在运行调用 COBOL 和 C 模块的程序时看到来自 iSeries 的调用。我还可以看到我正在返回一个简单的字符串值。
当 COBOL 程序试图获取返回值并使用它时,问题就来了。我相信 COBOL 代码的相关位是:
LINKAGE PROCEDURE FOR "TestSuccessfulMessage"
USING ALL DESCRIBED
LINKAGE SECTION.
01 LookupResult PIC X(1000).
CALL PROCEDURE "TestSuccessfulMessage"
USING BY VALUE STUB
RETURNING LookupResult.
以这种方式编码时,我得到了 MCH3601。如果我返回一个指针,然后将地址设置为 LookupResult,我将得到一个空值。
我希望我只是在某处遗漏了一个小细节。我的 COBOL 经验很少。我只是想创建一个引用应用程序作为我们公司内另一个团队的概念证明。任何帮助,或尝试什么的建议,将不胜感激。我可以提供更多代码。
更新:我尝试将 LookupResult 声明移动到工作存储中。虽然这消除了 MCH3601 错误,但我的显示器中出现了一堆垃圾数据。我可以在数据中看到关于我的 iSeries session 的信息片段(即设备 ID 等)。
我还尝试将 LookupResult 留在链接部分并在工作存储中创建一个指针。然后我添加了一个“将 LookupResult 的地址设置为 ResultPointer”。同样,调用结束时没有错误,但是当我显示 LookupResult 时,我得到了垃圾数据。但是,它与直接返回 LookupResult 时返回的数据不同。我可以在该数据中看到一些 SOAP 信封。
最终:我必须进行的所有更改都在 COBOL 代码中。以下是相关部分:
WORKING-STORAGE SECTION.
01 Endpoint PIC X(100).
01 STUB USAGE POINTER.
01 ResultPointer USAGE POINTER.
LINKAGE SECTION.
01 pszEndpoint PIC X(100).
01 LookupResult PIC X(7).
CALL PROCEDURE "TestSuccessfulMessage"
USING BY VALUE STUB
RETURNING INTO ResultPointer.
SET Address of LookupResult TO ResultPointer.
最佳答案
If I return into a pointer and then set the address to LookupResult, I end up with a null value.
我是 COBOL 人,但不是 iSeries 人。买者自负。
如果 xsdc__string 解析为一个指针,那么您的 COBOL 代码应该有一个 POINTER 类型的变量用于 CALL 的 RETURNING 部分。也许 C 函数实际上返回 NULL,代码当然允许它 - 也许 axiscCallInitialize 没有返回 AXISC_SUCCESS。
至少在 z/OS 上,您可能希望 COBOL 指针变量位于工作存储或本地存储中,然后您将 SET ADDRESS OF LookupResult TO 该指针变量。我假设这不会因为您使用不同的机器架构而改变。
...FWIW
关于c - 如何从 iSeries COBOL 调用 Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8568679/
我编写了以下程序,我很困惑为什么在编译程序时出现错误,说 A-COL(1,1) 不是数值,而显示 A-COL(1,1) 给我 1。 IDENTIFICATION DIVISION. PRO
需要将 4 个字符串连接到 cobol 中的目标变量。 喜欢, 01 WS-S1 X(10) VALUE "HI ". 01 WS-S2 X(10) VALUE "HOW ". 01 WS-S3 X(
大家好,这里有一大堆问题。我已经完成了一个我必须为大学作业做的程序,但是当我运行它时,输出几乎没有显示它应该显示的内容。这只发生在我运行它时。如果我在整个过程中按住 F11 到 STEP,它会显示预期
正如标题所暗示的,我正在做一个软件来计算和验证插入的数字是否是一个快乐的数字(或不是)。在 COBOL 语言中(有关什么是快乐数字的引用 https://mathworld.wolfram.com/H
为什么我不能在 COBOL 中执行此嵌套执行循环? 如果我把END-PERFORM。在任何一行中比我在 EXIT PROGRAM 之前拥有最后一个的地方早 - 它有效。但是我需要程序每次都显示 INP
我知道许多 COBOL 编译器确实允许嵌套副本(具有不同的深度),但我没有找到任何“官方”规则。问题: 是否有明确允许或禁止嵌套副本的 COBOL 标准? 有没有不允许嵌套copybooks的COBO
我对 COBOL 很陌生。我正在学习 Micro Focus 附带的教程,但似乎无法让示例正常工作。我正在尝试打印 -123.45 并且我不断收到以下信息, 我查了很多帖子,都没有解决我的问题。我在
COBOL 中是否有一种“等待”功能? 我写了一个计算器,为了让它更 50 多岁,我打印了“计算”。 “计算..” ecc 例如: DISPLAY "SECOND
好的,所以我正在做作业,但是随后我发现我被要求添加页码并为每4条记录更改页数。由于这是一门在线课程,我认为讲座视频中没有关于页码的任何信息。所以主要的问题是 要添加包含日期和页码的标题, 每页打印4条
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
Cobol 程序: PROGRAM-ID. SCHPROG. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION.
我正在使用屏幕部分在 Cobol 中开发一个系统,当我在另一个程序中创建的菜单中选择一个选项时,我无法调用客户注册程序。我正在使用带有 GnuCOBOL 编译器的 opencobol。 CALL "A
我正在构建一个 COBOL 程序来计算最多 15 个整数的平均值。执行显示的数字远大于预期,并带有很多尾随零。以下是相关代码: Data Division. Working
我正在开发一个 Wrapper/Bridge COBOL 程序,该程序处理程序调用并执行横切操作,如日志记录、安全检查等。 主要动机是检查消费者程序的安全访问是否有权调用生产者程序。 设桥接 COBO
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我有一项将 COBOL 代码转换为 .NET 的任务。有没有可用的转换器?我试图在高层次上理解 COBOL 代码。我无法理解 COBOL 代码。有流程图生成器吗?我很感激任何帮助。 谢谢.. 最佳答案
我有以下代码: 01 W-IX1 PIC 9(8) VALUE ZERO COMP-4. 01 W-INPUT-AMNT
我是 COBOL 编程的新手,所以我试图制作一个示例计算器,但我无法让它工作。 calc 进入无限循环,我没有找到原因,我什至尝试复制类似的代码,但没有成功。那么,这是 OpenCobolIDE 问题
我只是在学习 COBOL;我正在编写一个简单地回显用户输入的程序。我已经定义了一个变量: User-Input PIC X(30). 后来当我接受用户输入,然后显示用户输入“加上一些额外的文本”时,它
是否可以在Cobol程序中获取并显示当前行号?例如,C 允许通过以下方式进行: ... printf("Current line = %d\n", __LINE__); ... 最佳答案 简答:否。
我是一名优秀的程序员,十分优秀!