文章 姚 鑫 · 八月 22, 2024 2m read

第六章 设置和其他常见活动 - 编辑 IRIS 凭证集

编辑 IRIS 凭证集

创建 IRIS 凭证集后,可以按如下方式编辑它:

  1. 在管理门户中,选择系统管理 > 安全 > X.509 凭证。
  2. 在凭证集表中,别名列的值用作标识符。对于要编辑的凭证集,请单击编辑。
  3. 根据需要进行编辑。有关这些字段的信息,请参阅上一节。
  4. 单击“保存”以保存更改。

无法更改凭证集的别名或证书;也无法添加、更改或删除关联的私钥。要进行此类更改,请创建新的凭证集。

通过编程方式检索凭证集

执行加密或签名时,必须指定要使用的证书。为此,可以选择 IRIS 凭证集。

当手动创建 WS-Security 标头时,必须以编程方式检索凭据集并使用它。

作为参考,本节讨论以下常见活动:

  • 如何检索存储的凭证集
  • 如何从入站消息中检索凭证集

检索存储的凭证集

要检索 %SYS.X509Credentials的实例,请调用 GetByAlias() 类方法。此方法返回包含证书和其他信息的 IRIS 凭证集。例如:

 set credset=##class(%SYS.X509Credentials).GetByAlias(alias,password)
  • alias 是证书的别名。
  • pwd 是私钥密码;这仅适用于拥有证书的情况。仅当关联的私钥已加密且您在加载私钥文件时未加载密码时,才需要此密码。

如果不拥有该证书,则无法以任何形式访问私钥。

0
0 0
文章 姚 鑫 · 八月 21, 2024 3m read

第五章 设置和其他常见活动 - 创建 IRIS 凭证集

创建 IRIS 凭证集

要创建 IRIS 凭证集:

  1. 获取以下文件:
  • 个人 X.509 证书,采用 PEM 编码的 X.509 格式。

这可以是自己的证书,也可以是从希望与之交换 SOAP 消息的实体获取的证书。

  • (可选)关联的私钥,采用 PEM 编码的 PKCS#1 格式。

这仅适用于拥有证书的情况。如果不想签署出站消息,则无需加载私钥文件。

  • (可选)包含根证书的文件,即 PEM 编码格式的受信任的 CA X.509 证书,可与此凭证集一起使用。

有关创建这些文件的信息超出了本文档的范围。

  1. 在管理门户中,选择系统管理 > 安全 > X.509 凭证。
  2. 单击“创建新凭证”。
  3. 指定以下值:
  • Alias — 指定一个唯一的、区分大小写的字符串来标识此凭证集。此属性是必需的。
  • 包含 X.509 证书的文件 — 单击浏览...并导航到证书文件。此属性是必需的。
  • 包含相关私钥的文件 — 单击浏览...并导航到该文件。
  • 私钥密码和私钥密码(确认)— 指定私钥的密码。如果不指定密码,则在检索凭证集时必须提供密码。

仅当为包含关联私钥的文件指定值时才会显示这些字段。

  • 包含受信任的证书颁发机构 X.509 证书的文件 — 此凭证集信任的任何 CAX.509 证书的路径和文件名。证书必须采用 PEM 格式。路径可以指定为绝对路径或相对于管理器目录的路径。
0
0 0
文章 姚 鑫 · 八月 20, 2024 2m read

第四章 设置和其他常见活动

作为参考,本主题介绍了用于保护 Web 服务的常见活动。

执行设置任务

对于大多数与 SOAP 安全相关的任务,必须首先执行以下任务:

  • 提供可信证书供 IRIS 使用
  • 创建 IRIS 凭证集

这些任务也是使用 XML 工具中描述的某些任务的先决条件。

可能还需要创建 SSL/TLS 配置。有关信息,请参阅 TLS 指南。

IRIS 提供可信证书

IRIS 使用其自己的可信证书集合来验证入站 SOAP 消息(或 XML 文档)中的用户证书和签名。在加密出站 SOAP 消息中的内容或加密 XML 文档时,它也会使用这些证书和签名。此集合可供此 IRIS 安装的所有命名空间使用。要创建此集合,请创建以下两个文件并将它们放在系统管理器的目录中:

  • iris.cer — 包含根证书,即 PEM 编码格式的受信任 CA X.509 证书。如果想在 IRIS 中使用任何 WS-PolicyWS-Security 功能,则需要此文件。
  • iris.crl — 包含 PEM 编码格式的 X.509 证书撤销列表。此文件是可选的。

请注意,可以使用特定的 IRIS 凭证集作为备用根证书;请参阅下一节。

0
0 0
文章 姚 鑫 · 八月 18, 2024 3m read

第三章 使用 SOAP 保护 Web 服务 - IRIS 中的 WS-Policy 支持

IRIS 中的 WS-Policy 支持

支持 WS-Policy 1.2 (https://www.w3.org/Submission/WS-Policy/) 和 WS-Policy 1.5 (https://www.w3.org/TR/ws-policy) 框架以及相关的特定策略类型:

0
0 0
文章 姚 鑫 · 八月 16, 2024 4m read

第二章 使用 SOAP 保护 Web 服务 - WS-Security 标头简介

WS-Security 标头简介

SOAP 消息在 WS-Security 标头元素(SOAP <Header> 元素的 <Security> 子元素)中携带安全元素。以下示例显示了一些可能的组件:

这些元素如下:

  • 时间戳标记 (<Timestamp>) 包含 <Created><Expires> 元素,它们指定此消息有效的时间范围。严格来说,时间戳不是安全元素。但是,如果时间戳已签名,则可以使用它来避免重放攻击。
  • 二进制安全令牌 (<BinarySecurityToken>) 是二进制编码的令牌,其中包含使接收者能够验证签名或解密加密元素的信息。您可以将其与签名元素、加密元素和断言元素一起使用。
  • 用户名令牌 (<UsernameToken>) 使 Web 客户端能够登录 Web 服务。它包含 Web 服务所需的用户名和密码;默认情况下,这些内容以`文形式包含。有多种保护密码的选项。
  • 断言元素 (<Assertion>) 包含创建的 SAML 断言。断言可以是签名的,也可以是未签名的。

断言元素可以包含主题确认元素 (<SubjectConfirmation>)。此元素可以使用 Holder-of-key 方法或 Sender-vouches 方法。在前一种情况下,断言携带可用于其他目的的密钥材料。

0
0 0
文章 姚 鑫 · 八月 15, 2024 3m read

第一章 使用 SOAP 保护 Web 服务

IRIS 支持 WS-SecurityWS-PolicyWS-SecureConversationWS-ReliableMessaging 规范的部分内容,这些规范描述了如何为 Web 服务和 Web 客户端添加安全性。本主题总结了这些工具并列出了支持的标准。

如果 IRIS Web 客户端使用需要身份验证的 Web 服务,并且有特殊原因,则可以使用较旧的 WS-Security 登录功能。请参阅使用 WS-Security 登录功能。

IRIS 中与 SOAP 安全相关的工具

IRIS 提供以下与 Web 服务和 Web 客户端安全相关的工具:

  • 能够为 IRIS 提供可信证书,以用于验证入站消息中收到的证书和签名。
  • 能够表示 X.509 证书。可以在 IRISSYS 数据库中存储拥有的证书以及将与之通信的实体的证书。对于拥有的证书,如果需要签署出站消息,还可以存储相应的私钥。

IRISSYS 数据库中,X.509 证书包含在 IRIS 凭证集中,具体来说,包含在 %SYS.X509Credentials实例中。可以使用此类的方法将证书(以及可选的关联私钥文件,如果适用)加载到数据库中。可以直接执行这些方法,也可以使用管理门户。

可以指定谁拥有凭证集以及谁可以使用它。

0
0 0
文章 姚 鑫 · 八月 14, 2024 2m read

第十章 指定 SAX 解析器的标志

指定 SAX 解析器的标志

Web 客户端调用 Web 服务时,它会在内部使用 SAX 解析器,这是 IRIS 附带的第三方产品。可以设置 Web 客户端的 SAXFlags 属性,以设置解析器要使用的标志。

要使用 WS-Security 登录功能:

  1. 确保在 Web 客户端和托管 Web 服务的 Web 服务器之间使用 SSLWS-Security 标头以明文形式发送,因此除非使用 SSL,否则此技术并不安全。请参阅将客户端配置为使用 SSL
  2. 调用 Web 客户端的 WSSecurityLogin() 方法。此方法接受用户名和密码,生成带有明文密码的 WS-Security 用户名令牌,并将 WS-Security 标头添加到 Web 请求。
  3. 调用 Web 方法。

此技术仅将安全令牌添加到下一条 SOAP 消息中。

使用 HTTP 身份验证

某些 Web 服务需要 HTTP 身份验证,而不是使用 WS-Security(在“保护 Web 服务”中进行了描述)。对于这些 Web 服务, IRIS 数据平台支持以下 HTTP 身份验证方案:

  1. 协商(SPNEGOKerberos,符合 RFC 4559RFC 4178
  2. NTLMNT LAN 管理器身份验证协议)
  3. Basic 基本(RFC 2617 中描述的基本访问身份验证)
0
0 0
文章 姚 鑫 · 八月 13, 2024 2m read

第九章 从 Web 客户端指定自定义传输

从 Web 客户端指定自定义传输

默认情况下,如果使用 Web 客户端,Web 客户端将使用 HTTPSOAP 消息传输到 Web 服务并接收响应。可以定义并使用自己的传输类。

背景

为了与其使用的 Web 服务进行通信, Web 客户端需要一个传输类。传输类包含与通信相关的参数、属性和方法。整体通信工作方式如下:

  1. 运行 Web 客户端代理方法时,Web 客户端实例会检查其 Transport 属性的值。

如果此属性为空,则 Web 客户端实例将使用自身作为传输类实例。可以将 Transport 属性设置为其他合适类的实例(如果已定义此类)。

  1. Web 客户端实例执行传输类的 DoSOAPRequest() 方法,并传递以下参数:

a. Web 客户端类的 OREF

b. 指定 SOAP 操作的字符串。

c. 包含以 UTF-8 编码的请求的流。

d. (通过引用)包含响应的流。

  1. Web 客户端实例检查结果的状态并采取相应行动。

对于 HTTP 传输,DoSOAPRequest() 方法包括以下逻辑:

0
0 0
文章 姚 鑫 · 八月 12, 2024 2m read

第八章 指定自定义 HTTP 请求

默认情况下,Web 客户端使用 HTTPSOAP 消息传输到 Web 服务并接收响应。Web 客户端会自动创建并发送 HTTP 请求,但可以创建自定义 HTTP 请求。为此,请使用以下步骤:

  1. 在创建 %Net.HttpReques 的实例并根据需要设置属性。有关此类的信息,请参阅使用 Internet 实用程序或 %Net.HttpRequest类文档。
  2. Web 客户端的 HttpRequest 属性设置为等于此实例。

如果希望在同一会话中支持对 SOAP 服务的多次调用,这尤其有用。默认情况下, Web 客户端不支持使用同一会话对 SOAP 服务进行多次调用。要解决此问题,创建一个新的 %Net.HttpRequest 实例,并将其用作 Web 客户端的 HttpRequest 属性。此更改强制对所有调用重复使用相同的 HTTP 请求,这将在对下一个请求的响应中返回所有 cookie

自定义 Web 客户端的回调

可以通过覆盖其回调方法来定制 Web 客户端的行为:

%OnSOAPRequest()

0
0 0
文章 姚 鑫 · 八月 11, 2024 2m read

第七章 解析时使用进程私有全局变量

默认情况下, Web 客户端在解析请求或响应时通常使用本地数组内存。可以强制它改用进程私有全局变量;这使 Web 客户端能够处理非常大的消息。

为此,请指定 Web 服务类的 USEPPGHANDLER 参数,如下所示:

Parameter USEPPGHANDLER = 1;

如果此参数为 1,则 Web 客户端在解析请求或响应时始终使用进程私有全局变量。如果此参数为 0,则 Web 客户端始终使用本地数组内存来实现这些目的。如果未设置此参数,则 Web 客户端使用默认值,通常是本地数组内存。

可以在运行时覆盖此参数。为此,请设置 Web 客户端实例的 UsePPGHandler 属性。

创建自定义 SOAP 消息

在特殊情况下,可能希望 Web 客户端发送自定义 SOAP 消息。基本要求如下:

  1. 创建 %SOAP.WebRequest的子类并设置其 LOCATION 参数或 Location 属性。
  2. 在此子类中,创建一个方法来发送 SOAP 消息。此方法必须创建 %Library.CharacterStream的实例,并将要发送的 SOAP 消息放入其中。有责任确保消息格式正确。
  3. 该方法接下来必须调用 SendSOAPBody() 方法:
0
0 0
文章 姚 鑫 · 八月 10, 2024 2m read

[toc]

第六章 定义单向 Web 方法

通常,当 Web 客户端调用 Web 服务时,会返回 SOAP 消息,即使该方法没有返回类型并且在 数据平台中执行时不返回任何内容。

在极少数情况下,可能需要将 Web 方法定义为单向的。此类方法不得返回任何值,并且消息不需要 SOAP 响应。

注意:通常不应使用单向方法。请求-响应对更为常见、更受支持且更受期待 — 即使对于没有返回类型的方法也是如此。

要定义单向 Web 方法,请将该方法的返回类型定义为 %SOAP.OneWayWSDL 未定义此 Web 方法的输出,并且 Web 服务不返回 SOAP 消息。

向二进制数据添加换行符

可以使 Web 服务在新选项卡中为 %Binary 类型属性中为 %xsd.base64Binary 类型属性添加自动换行符。为此,请执行以下操作之一:

  • Web 服务类中将 BASE64LINEBREAKS 参数设置为 1
  • 对于 Web 服务类实例,将 Base64LineBreaks 属性设置为 1。此属性的值优先于 BASE64LINEBREAKS 参数设置的值。

对于参数和属性,默认值为 0;默认情况下, Web 服务不包括新选项卡中 %Binary类型属性或中 %xsd.base64Binary类型的属性的自动换行符。

SOAP 消息添加字节顺序标记

0
0 0
文章 姚 鑫 · 八月 9, 2024 2m read

第五章 引用 SOAP 操作(仅限 SOAP 1.1)

引用 SOAP 操作(仅限 SOAP 1.1

SOAP 1.1 请求消息中,HTTP 标头包含如下 SOAPAction 行:

POST /csp/gsop/GSOP.DivideWS.cls HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; InterSystems IRIS;)
Host: localhost:8080
Connection: Close
Accept-Encoding: gzip
SOAPAction: http://www.mynamespace.org/GSOAP.DivideWS.Divide
Content-Length: 397
Content-Type: text/xml; charset=UTF-8

...

默认情况下,SOAPAction的值不带引号。要将此值放在引号中,请在 Web 客户端类中将 SOAPACTIONQUOTED 指定为 1。然后请求消息的 HTTP 标头将如下所示:

0
0 0
文章 姚 鑫 · 八月 8, 2024 2m read

第四章 控制编码格式的内联引用的使用

控制编码格式的内联引用的使用

采用编码格式,任何对象值属性都作为引用包含在内,并且引用的对象作为单独的元素写在 SOAP 消息中。

要以内联方式写入编码对象,请在 Web 客户端中将 REFERENCESINLINE 参数或 ReferencesInline 属性指定为 `1。属性优先于参数。

指定信封前缀

默认情况下, Web 客户端在其发送的 SOAP 消息的信封中使用前缀 SOAP-ENV。可以指定不同的前缀。为此,请设置 Web 客户端类的 SOAPPREFIX 参数。例如,如果将此参数设置为 MYENV,则 Web 客户端会在其消息中包含此前缀,而不是 SOAP-ENV

将命名空间声明添加到 SOAP 信封

要将命名空间声明添加到给定 Web 客户端返回的 SOAP 响应的 SOAP 信封(<SOAP-ENV:Envelope>元素)中,请在调用 Web 方法之前调用 Web 客户端的 %AddEnvelopeNamespace() 方法。此方法具有以下签名:

0
0 0
文章 姚 鑫 · 八月 7, 2024 1m read

第三章 控制 xsi:type 属性的使用

控制 xsi:type 属性的使用

默认情况下, SOAP 消息仅包含顶级类型的 xsi:type属性。例如:

<?xml version="1.0" encoding="UTF-8" ?>
...
<types:GetPersonResponse>
<GetPersonResult href="#id1" />
</types:GetPersonResponse>
<types:Person id="id1" xsi:type="types:Person">
<Name>Yeats,Clint C.</Name>
<DOB>1944-12-04</DOB>
</types:Person>  
...

在这些示例中,已添加换行符以提高可读性。要将此属性用于 SOAP 消息中的所有类型,请执行以下操作之一:

  • Web 客户端实例中将 OutputTypeAttribute 属性设置为等于 1
  • Web 客户端类中将 OUTPUTTYPEATTRIBUTE 参数设置为等于 1

相同的输出将如下所示:

0
0 0
文章 姚 鑫 · 八月 6, 2024 2m read

第二章 使用代理服务器

使用代理服务器

Web 客户端可以通过代理服务器与 Web 服务通信。要进行设置,请指定 Web 客户端实例的属性以指示要使用的代理服务器。这些属性如下:

HttpProxyServer

指定要使用的代理服务器的主机名。如果此属性不为空,则 HTTP 请求将定向到此计算机。

HttpProxyPort

指定代理服务器上要连接的端口。

HttpProxyHTTPS

如果使用代理服务器并且该代理服务器支持 HTTPS,则将其指定为 true

请注意,如果使用 HTTPS,则还必须将客户端的 SSLConfiguration 属性设置为 SSL/TLS 配置的名称;有关更多详细信息,请参阅配置客户端以使用 SSL

HttpProxyAuthorization

如果 Web 客户端需要向代理服务器验证自身身份,请将其指定为所需的 Proxy-Authorization 标头字段。

HttpProxyTunnel

0
0 0
文章 姚 鑫 · 八月 5, 2024 2m read

第一章 修改 Web 客户端

修改 Web 客户端

生成 Web 客户端类后,通常不需要编辑该类。相反,需要编写代码来创建该类的实例并提供客户端错误处理。本主题讨论了微调 Web 客户端的各种方法,可以通过修改 Web 客户端实例或(不太常见)修改生成的类来实现。

注意:不要创建生成的 Web 客户端类的子类。编译器不会生成正常运行所需的支持类,因此子类将无法使用。

禁用 Web 客户端的 Keep-Alive

默认情况下,如果重复使用 Web 客户端实例来发送多条请求消息,IRIS 会在一次 HTTP 传输中发送所有消息(使用 HTTP 1.1 保持活动连接)。具体来说,IRIS 保持 TCP/IP 套接字打开,这样 IRIS 就无需关闭并重新打开它。要禁用此保持活动行为,请执行以下操作之一:

  • 终止 Web 客户端实例并创建并使用一个新的。
  • 发送第一条消息后,将客户端的 HttpRequest.SocketTimeout 属性设置为 0。例如:
Set client.HttpRequest.SocketTimeout=0

注意:如果正在使用 WS-ReliableMessaging 并使用 SSL/TLSWeb 服务通信,请不要禁用保持活动。有关 WS-ReliableMessaging 的信息,请参阅保护 Web 服务。

控制空字符串参数的形式

0
0 0
文章 姚 鑫 · 八月 4, 2024 2m read

[toc]

第十二章 在 Web 服务中定义自定义处理 - 实现 ProcessBody()

实现 ProcessBody()

ProcessBody() 方法具有以下签名:

method ProcessBody(action As %String, requestBody As %CharacterStream, 
                   ByRef responseBody As %CharacterStream) as %Boolean

其中:

  • action 是入站消息中指定的 SOAP 操作。
  • requestBody%Library.CharacterStream 的一个实例,包含 SOAP<Body> 元素。该流包含 XML 片段,而不是完整的 XML 文档。
  • responseBody,是序列化为 %Library.CharacterStream 实例的响应主体。此流通过引用传递,最初为空。

如果在 Web 服务中实现此方法,则该方法应执行以下操作:

  1. 检查操作并相应地分支。例如:
 if action["action1" { 
  //details
 }
  1. 使用 requestBodyRead() 方法获取 SOAP <Body>。例如:
 set request=requestBody.Read()
  1. 使用 $EXTRACT 等工具解析此流。例如:
0
0 0
文章 姚 鑫 · 七月 30, 2024 3m read

第九章 使用进程私有全局变量来支持非常大的消息

使用进程私有全局变量来支持非常大的消息

默认情况下、 Web 服务在解析请求或响应时通常使用本地数组内存。可以强制它改用进程私有全局变量;这使 Web 服务能够处理非常大的消息。

为此,请指定 Web 服务类的 USEPPGHANDLER 参数,如下所示:

Parameter USEPPGHANDLER = 1;

如果此参数为 1,则 Web 服务在解析请求或响应时始终使用进程私有全局变量。如果此参数为 0,则 Web 服务始终使用本地数组内存来实现这些目的。如果未设置此参数,则 Web 服务使用默认值,通常是本地数组内存。

自定义 Web 服务的回调

可以通过覆盖其回调方法来定制 Web 服务的行为:

OnRequestMessage()

如果没有安全错误,则在 Web 服务收到请求消息时调用;如果出现安全错误,则不会调用此回调。系统在执行安全处理、检查信封是否有错误以及处理 WS-Addressing 标头中指定的操作(如果有)后调用此回调。此回调对于记录原始 SOAP 请求等任务很有用。

此方法具有以下签名:

Method OnRequestMessage(mode As %String, action As %String, request As %Stream.Object)

其中:

0
0 0
文章 姚 鑫 · 七月 27, 2024 1m read

第五章 控制 xsi:type 属性的使用

控制 xsi:type 属性的使用

默认情况下, SOAP 消息仅包含顶级类型的 xsi:type 属性。例如:

<?xml version="1.0" encoding="UTF-8" ?>
...
<types:GetPersonResponse>
<GetPersonResult href="#id1" />
</types:GetPersonResponse>
<types:Person id="id1" xsi:type="types:Person">
<Name>Yeats,Clint C.</Name>
<DOB>1944-12-04</DOB>
</types:Person>  
...

在这些示例中,已添加换行符以提高可读性。要将此属性用于 SOAP 消息中的所有类型,请将 OUTPUTTYPEATTRIBUTE 参数或 OutputTypeAttribute 属性设置为 1。相同的输出将如下所示:

0
0 0
文章 姚 鑫 · 七月 25, 2024 2m read

第四章 覆盖 HTTP SOAP 操作和请求消息名称

覆盖 HTTP SOAP 操作和请求消息名称

当通过 HTTP 调用 Web 方法时,HTTP 标头必须包含 SOAP 操作,该操作是指示 SOAP HTTP 请求意图的 URI。对于 SOAP 1.1SOAP 操作作为 SOAPAction HTTP 标头包含在内。对于 SOAP 1.2,它包含在 Content-Type HTTP 标头中。

SOAP 操作指示 SOAP HTTP 请求的意图。该值是一个标识意图的 URI;它通常用于路由入站 SOAP 消息。例如,防火墙可以使用此标头适当地过滤 HTTP 中的 SOAP 请求消息。

对于 Web 服务中的 Web 方法,SOAPAction HTTP 标头默认具有以下形式(对于 SOAP 1.1):

SOAPAction: NAMESPACE/Package.Class.Method

其中 NAMESPACEWeb 服务的 NAMESPACE 参数的值,Package.Class.Method 是用作 Web 方法的方法的名称。例如:

SOAPAction: http://www.myapp.org/GSOAP.WebService.GetPerson
0
0 0
文章 姚 鑫 · 一月 23, 2024 3m read

第七章 使用 SQL Search - 同义词表

同义词表

要实现同义词表,请将该表定义为扩展 iFind.Synonym 抽象类的持久类。

此类定义了两个属性:FromTermToTerm。一对 FromTermToTerm 属性将 ToTerm 定义为 FromTerm 的同义词。如果查询包含 FromTermSQL 搜索将使用 ToTerm 来扩展查询。

该查询使用此类的 GetMatch() 方法根据查询词在同义词表中搜索同义词。

在查询执行期间,SQL 搜索会检查单个单词单元或位置搜索短语是否存在任何同义词。例如,在同义词表中定义了两个同义词对(“persons”、“people”)(“walk”、“run”)。对短语“persons walk”执行 SQL 搜索查询。如果同义词表与查询关联,则 SQL 搜索不仅返回与原始查询匹配的文档,还返回与以下任一查询匹配的文档:“people run”、“people walk”“people run”

0
0 64
文章 姚 鑫 · 一月 5, 2024 3m read

第十六章 调用Callout Library函数

Callout 库是一个共享库(DLLSO 文件),其中包含 $ZF Callout 接口的挂钩,允许各种 $ZF 函数在运行时加载它并调用其函数。 $ZF Callout 接口提供了四种不同的接口,可用于在运行时加载 Callout 库并从该库调用函数。这些接口的主要区别在于如何识别库并将其加载到内存中:

0
0 64
文章 姚 鑫 · 一月 4, 2024 2m read

第十五章 创建Callout Library - 处理 UNIX 信号处理错误

处理 UNIX 信号处理错误

UNIX 及相关操作系统下运行时,如果进程收到信号,某些系统调用可能会失败,最常见的是打开、读取、写入、关闭、ioctl 和暂停。如果函数使用任何这些系统调用,代码必须能够区分真正的错误、Ctrl-C 和应重新启动的调用。

以下函数允许检查异步事件并在 $ZF 中设置新的警报处理程序。函数声明包含在 iris-cdzf.h 中:

sigrtclr()

int sigrtclr(); — 清除重试标志。应在使用 sigrtchk() 之前调用一次。

dzfalarm()

int dzfalarm(); — 建立新的 `SIGALRM 处理程序。

进入 $ZF 时,会自动保存先前的处理程序。退出时会自动恢复。用户程序不应改变任何其他信号的处理。

sigrtchk()

int sigrtchk(); — 检查异步事件。每当以下系统调用之一失败时就应该调用:open、close、read、write、ioctl、pause 或进程收到信号时失败的任何调用。它返回一个代码,指示用户应采取的操作:

0
0 70
文章 姚 鑫 · 十二月 31, 2023 3m read

第十一章 创建Callout Library - 使用 J 链接类型传递标准计数字符串

使用 J 链接类型传递标准计数字符串

iris-callin.h 头文件定义了计数字符串结构 IRIS_EXSTR,表示标准 IRIS 字符串。此结构包含一个字符元素数组(8 位、16Unicode32wchar t)和一个指定数组中元素数量的 int 值(最多字符串长度限制):

typedef struct {
   unsigned int   len;         /* length of string */
   union {
      Callin_char_t  *ch;      /* text of the 8-bit string */
      unsigned short *wch;     /* text of the 16-bit string */
      wchar_t        *lch;     /* text of the 32-bit string */
/* OR unsigned short *lch   if 32-bit characters are not enabled */
   } str;
} IRIS_EXSTR, *IRIS_EXSTRP;

0
0 50
文章 姚 鑫 · 十二月 27, 2023 2m read

百讲知识点索引

简介

  • B站已更新截止到2023.12.31之前的所有百讲课程,总计261讲。
  • 什么是百讲?百讲是一个主要介绍IRISCache编程知识的免费课程。
  • 课程的特点是,将每一个知识点,都会用示例演示出来、了解原理,而不是仅仅告诉有这个功能。
  • 每周一期,每期会请到有多年开发经验的老师来给大家讲解课程。
  • 百讲观看地址:https://www.bilibili.com/video/BV1cw41147xr/

知识点索引

0
0 192
文章 姚 鑫 · 十二月 27, 2023 2m read

第七章 创建Callout Library - 创建 ZFEntry 表

创建 ZFEntry

每个 Callout 库必须定义一个 ZFEntry 表,该表允许 IRIS 加载和访问 Callout 函数。 ZFEntry 表由以 ZFBEGIN 开头、以 ZFEND 结尾的宏代码块生成。在这两个宏之间,必须为要公开的每个函数调用一次 ZFENTRY 宏。

每个 ZFENTRY 调用都采用三个参数:

   ZFENTRY(zfname,linkage,entrypoint)

其中 zfname 是用于在 $ZF 调用中指定函数的字符串,linkage 是指定如何传递参数的字符串,entrypointC 函数的入口点名称。

要创建 Callout 库,代码必须包含 #define ZF_DLL 指令,该指令是一个开关,可生成用于定位库函数的内部 GetZFTable 函数。加载 Callout 库时, IRIS 调用此函数来初始化该库,以便后续查找库函数名称。

注意:ZFEntry 序列号

ZFEntry 表中条目的位置可能很重要。 $ZF(-5)$ZF(-6) 接口(在“调用标注库函数”中描述)都通过指定表中的序列号(从 1 开始)来调用库函数。例如,$ZF(-6) 将通过以下调用调用 ZFEntry 表中的第三个函数:

   x = $ZF(-6,libID,3)
0
0 70
文章 姚 鑫 · 十二月 26, 2023 4m read

第六章 创建Callout Library

Callout library 库是一个共享库,其中包含自定义Callout函数和允许 IRIS使用它们的启用代码。本章描述如何创建Callout库并在运行时访问它。

  • Callout library 简介-描述如何创建和访问Callout library
  • ZFEntry链接选项 - 提供了决定如何传递函数参数的链接选项的详细描述。
  • 兼容语言和编译器-描述如何使用C以外的语言创建Callout库。
  • Callout Library运行和运行函数-描述两个可选函数,可将其设置为在加载或卸载标注库时自动运行。
  • 故障排除和错误处理-列出了一些应该避免的编码实践,并描述了处理UNIX信号处理错误的特殊函数。

注:共享库和标注库的术语,共享库shared library是指动态链接的文件(Windows上的DLL文件或UNIX及相关操作系统上的SO文件)。Callout library是一个共享库,它包含到$ZF Callout接口的钩子,允许各种$ZF函数在运行时加载和访问它。

Callout库简介

ObjectScript代码访问Callout库有几种不同的方法,但一般原则是指定库名、函数名和任何必需的参数(请参阅“调用Callout库函数”)。例如,下面的代码调用一个简单的Callout库函数:

0
0 79
文章 姚 鑫 · 十二月 25, 2023 2m read

第五章 使用$ZF(-100)运行程序或系统命令 - 增加权限

增加%System_Callout:USE权限

$ZF(-100)需要%System_Callout:USE权限。如果安全设置高于最小值,则可能会禁用此特权。下面的过程描述了如何在%Developer角色中启用它:

%Developer角色中启用%System_Callout:USE

  1. 在“管理门户”中,选择“系统管理员>安全>角色”。
  2. Roles页面上,单击Names列中的%Developer
  3. Edit %Developer页面的General选项卡上,找到%System_Callout权限并单击Edit
  4. 在“编辑资源权限”对话框中,如果尚未选中,请选中“权限使用”复选框,然后单击“确定”。

%Developer角色总是在安装 IRIS时创建,但是管理员可能不希望所有用户都可以使用它。在某些情况下,可能需要为用户提供一个角色,使$ZF(-100)可用,但不授予任何其他特权。下面的过程创建了一个只授予%System_CallOut:USE权限的新角色:

在新角色中启用%System_Callout:USE

0
0 77
文章 姚 鑫 · 十二月 23, 2023 3m read

第三章 使用$ZF(-100)运行程序或系统命令

$ZF(-100)函数允许 IRIS 进程调用可执行程序或主机操作系统的命令。这是唯一可以在没有特殊的Callout共享库的情况下使用的$ZF函数。

  • $ZF(-100)的语法和功能概述。
  • 程序执行-程序可以选择异步运行或在操作系统外壳中运行。
  • 记录命令和重定向输出——可选设置可以记录命令或重定向I/O
  • 添加%System_Callout:USE特权—使用$ZF(-100)需要此特权。

注意:$ZF(-100)取代了已弃用的函数$ZF(-1)$ZF(-2),在所有情况下都应优先使用。

介绍

$ZF(-100)提供类似于命令行接口的功能,允许调用可执行程序或主机操作系统的命令。这个函数的语法是:

status = $ZF(-100, keywords, command, arguments )

第一个参数必须是字面量-100。其他三个参数指定以下信息:

  • Keywords - 包含指定各种选项的关键字的字符串。例如,字符串"/ASYNC/LOGCMD"指定程序应该异步运行,并将命令行写入日志文件。
  • Command - 指定要调用的程序或系统命令的字符串。如果未指定可执行文件的完整路径,则操作系统将应用标准搜索路径规则。
  • 参数 - 命令参数被指定为一系列以逗号分隔的表达式(如下面的示例所示)。
0
0 81
文章 姚 鑫 · 十二月 22, 2023 3m read

第二章 $ZF Callout函数概述

IRIS $ZF系统功能是一套相关功能的容器。$ZF套件中的大多数函数都由函数调用的第一个参数标识,该参数将是一个负数,-100-3-6。例如,调用操作系统命令的函数具有$ZF(-100, <oscommand>)的形式,其中<oscommand>是包含要执行的命令的字符串。当讨论这个函数时,它将被称为$ZF(-100)。以同样的方式,其他函数将被称为$ZF(-3)$ZF(-6),只使用实际函数调用的第一个参数。也可以在不带负数参数的情况下调用$ZF()函数,在这种情况下,它调用名为iriszf的特殊Callout库中的函数。

注:Callout Libraries是动态链接的文件(WindowsDLL文件,UNIX及相关操作系统为SO文件)。Callout库是一个共享库,它包含到$ZF Callout接口的钩子,允许各种$ZF函数在运行时加载它并调用库函数。

$ZF函数集包括以下接口:

$ZF()函数(不带负数参数)

主要的$ZF()函数提供了对来自名为iriszf的特殊Callout库的函数的直接访问。当定义并编译了这个自定义库后,只需指定函数名和参数(例如,$ZF("myFunction",arg1)),就可以调用它的函数。与$ZF(-3)$ZF(-5)$ZF(-6)不同,不需要加载库或指定库标识符。

$ZF(-100)函数

0
0 58