0 关注者 · 44 帖子

Caché 服务器页面 (CSP) 是一种架构和工具集,用于通过 InterSystems 数据平台构建交互式 Web  应用程序。

文章 YuCheng Hu · 八月 1, 2024 3m read

针对 InterSystems IRIS 数据库的一些基本概念。

InterSystems IRIS 是什么

InterSystems IRIS 是基于 Caché/M 语言开发的一个数据库,这个数据库被大量使用在医疗系统中,也是北美地区医疗系统病历和文件管理中默认使用的事实标准。

Caché/M 是什么

Caché/M 是 MUMPS 程序语言 开发的数据库,Caché/M 提供了代码接口,可以直接使用 Caché/M 对数据库来进行操作。

Caché 是一个法语单词,但是又非常容易和英语使用的 Cache 搞混,所以大部分时候使用的是 Caché/M 来表达。

M 表达的意思是 Mumps 程序语言,简称 M 语言,Caché 使用 M 语言构建了不少函数。

InterSystems IRIS 不是开源数据库

因为涉及到医疗系统数据的使用,所以 InterSystems IRIS 并不是一个开源的数据库,你可以使用下面的链接:Evaluate InterSystems Products 8 来下载评估版本。

本文就是根据下载的链接来进行 Windows 安装的教程。

上面的页面在下载之前,你需要进行注册,并且提供你的信息。

双击运行

当下载完成后,可以双击运行安装程序。

我们会看到下面的安装界面:

InterSystems-IRIS-Windows-Install-01

同意许可协议后,单击下一步继续安装。

配置实例名

我们在这里使用默认的就可以,通常使用的 IRIS。

0
0 447
文章 Michael Lei · 二月 18, 2024 11m read

1. IRIS RAG Demo

IRIS RAG Demo

这是 IRIS 与 RAG(检索增强生成)示例的一个简单演示。 后端是使用 IRIS 和 IoP用 Python 编写的,LLM 模型是 orca-mini 并由 ollama 服务器提供。 前端是用 Streamlit 编写的聊天机器人。

    1. IRIS RAG 演示](#1-iris-rag-demo)
    • 1.1. 什么是 RAG](#11-what-is-rag)
    • 1.2. 如何工作?
    • 1.3. 安装演示](#13-installation-the-demo)
    • 1.4. 使用方法
    • 1.5. 演示如何运行](#15-演示如何运行)
      • [1.5.1. 前端](#151-前端)
      • 1.5.2. 后台
        • [1.5.2.1. 业务服务](#1521-业务服务)
        • [1.5.2.2. 业务流程](#1522-业务流程)
        • [1.5.2.3. LLM 操作](#1523-the-llm-operation)
        • 1.5.2.4. 矢量操作](#1524-the-vector-operation)
    • 1.6. 一般性说明](#16-一般性说明)

1.1. 什么是 RAG?

RAG 是 Retrieval Augmented Generation(检索增强生成)的缩写,它带来了使用带有知识库的 LLM 模型(GPT-3.

1
0 665
问题 huang YG · 二月 27, 2024
02/21/24-18:32:48:515 (7568) 3 InterSystems IRIS Internal Failure

Access Violation (0xC0000005) occurred at 00007FFF3DE9C4E8
Process = 00001D90 Thread = 0000203C
Exception Count=1 b_msyslog=0 b_DumpVar=0 b_DumpVar2=0
b_GRelease=0 b_GRelease2=0 b_DeqRes=0 b_DeqRes2=0
Job Type = CSP server
ContextFlags = 0010005F Registers:
RAX=00007FFF3DE9C4E8 RBX=000000C2E5554800 RCX=000000C2E7AFFC00
RDX=000000C2E7B00000 RSI=00000000FFFFFFC0 RDI=00000000000003FF
RSP=000000C25CEBD2F8 RBP=0000000000000000 R8 =0000000000000001
R9 =00007FFF3DE60000 R10=000000C2E7AFFC00 R11=000000C2E7AFFC00
R12=0000000000005C9D R13=000000C2E46040E6 R14=00000000FFFFFFC0
R15=0000000000000000 RIP=00007FFF3DE9C4E8 EFL=10206
Stack:  Base = 000000C25CEC0000, Limit = 000000C25CEA7000, Size = 00019000
 00007FF74206EB9B 0000147B00000000 000000C2E55B7380 0000000000000000
 00000000FFFFFFC0 0000000000000000 00000000000003FF 0000000000000000
 00000000FFFFFFFE 000000C2E5554800 00007FF74206E727 00000000000015E6
 000000C2E5554CC0 000000C2E5554800 000000C2E46017F0 000000C25CEBD380
 000000C200000000 00007FF70000147B 000000C2E4600020 000000C2E4600020
 00007FF741DFA094 0000000000007D00 0000000000200042 0000000000000000
 00007FF7421FB1A0 000000C2E4600020 00000000FFFFFFC0 000000C2E5554800
 00007FF742071703 000000C200000001 0000000000007D00 00007FF7421ECDC0
 00007FF700000000 000000C200000001 00007FF700007D00 000000C200000000
 00007FF741C38D9F 0000000000007D00 000000C2DAEFD7EE 00000000FFFFFFC0
 0000000000000000 0000000000000000 00007FF741DC38E2 00007FF7421FB198
 00007FF7421FB1A0 0000000000007D00 000000C2E5554800 FFFFFFFFFFFFFFFF
 00007FF741DC7102 0000000000000000 0000000000007D00 00007FF7421FB1A0
 00000000FFFFFFC0 0000000000007D00 00007FF7420490A7 00007FF7421FB198
 00007FF7421ECDC0 000000C2E4600020 00007FF7421FB198 0000000000000001
 00007FF741BFA0B0 00000000000002BB 000000C2E4600020 00007FF7421FB198
 0000000000000175 0000000000000013 000000C2E4600068 000000C2E555BEC2
 0000000000000000 0000000000000004 0000000000000000 000000C25CF3CC10
 0000000000000100 0000000000000000 0000000000000000 0000000000000008
 0000000000000001 0000000000000000 00007FF741F9D179 0000000000000000
 000000C25CF30068 0000000000000004 0000000000000001 000000C25CEBF630
 000000000000FFFF 0000000000000000 000000C2D3F5807F 000000C25CEBD59A
 0000027F00001FA0 000000C25CEBD570 0000000000000000 000000C25CEBD570
 000000C25CF3CC10 0000000000000001 0000000000000000 0000000000000100
 0000000000000000 0000000000000000 0000000000000008 00007FF741F9D0B9
 0000027F00001FA0 0000000000000000 0000000000000000 0000000000000000
 0000000000000000 0000000000000000 0000000000000000 0000000000000000
 0000000000000000 0000000000000000 0000000000000000 0000000000000000
 0000000000000000 0000000000000000 0000000000000000 0000000000000000
 0000000000000000 0000000000000000 0000000000000000 0000000000000000
 0000000000000000 00007FF7421F185A 00007FF741E0E8E4 00007FF7421F185A
 000000C25CF3CC10 0000000000000001 000000C25CF5E150 0074006100500053

Version = IRIS for Windows (x86-64) 2019.1 (Build 510_4U) Thu Jun 13 2019 15:29:51 EDT
Current Routine = zRead+13^%Stream.FileBinary.1, Principal Device = |TCP|51773|7568
Please contact InterSystems Technical Support with this information.
    Tel: +1 (617) 621-0700  Fax: +1 (617) 494-1631  Email: support@intersystems.com
1
0 175
文章 Michael Lei · 八月 17, 2023 1m read

受到@Evgeny Shvarov 的问题@Ashok Kumar Thangavel 的回复的启发
我已经创建了一个用于把Global下载成 XML 文件的基础

如何使用:
只需调用 http://<your_server>/csp/samples2/dc.Gdown.cls ?GBL=global_name之类的页面

gbl-name 不带首字母 ^(插入符号)
输出具有默认名称 <global_name>.XML 您可以选择。

已知限制:

  • 你必须将它安装在你的源服务器上
  • 它没有经过测试/跨命名空间工作
  • 没有部分下载
  • 错误处理只是基本或缺失

个人还有提升空间。
就是这样:

 ClassExtends%CSP.Page
0
0 327
文章 Weiwei Gu · 八月 14, 2023 2m read

在提交的 WRC case中(Intersystems 全球技术支持响应中心),我们经常看到客户提出有关新 Web 网关设置的问题,其中管理门户加载一半,但不显示图像。本文将解释为什么会出现此错误,以及如何修复它。本说明主要针对服务 InterSystems IRIS 实例的 Web 网关,但相同的说明也应适用于服务 Caché 实例的 CSP 网关。

问题:

您刚刚在独立的 Web 服务器上安装了 Web Gateway。当你去加载管理门户时,你发现它无法显示或加载图像,如下所示:

为什么会发生这种情况:

问题是,为了完整加载管理门户,InterSystems IRIS 必须加载许多 .js、.css 和 .png 文件(静态文件)。如果您看到像上面这样的管理门户页面,请随时打开浏览器的开发人员工具小程序,导航到“网络”选项卡,并确认未提供各种 .js、.css 和 .png 组件:

最初安装 Web Gateway 时,我们仅为以下扩展设置映射:

.csp .cls .zen .cxw

这些是客户在自己的自定义应用程序中最常使用的文件扩展名类型,以及用于为 Web Gateway 管理门户提供服务的 .cxw 扩展名。如果您想要加载其他管理门户组件,则必须注册其他文件类型以由 Web 网关提供服务。

如何解决该问题:

要使管理门户完全显示,您必须配置 Web 网关以提供其他文件类型。

0
0 190
文章 Weiwei Gu · 八月 7, 2023 1m read

InterSystems 常见问题解答标题

您可以为以下 Web Gateway 错误消息/系统响应设置单独的错误页面:

  • 服务器错误
  • 服务器繁忙
  • 服务器无法使用
  • 服务器超时
  • 连接关闭

在 Web Gateway 管理界面上进行设置([Management Portal] > [System Administration] > [Configuration] > [Web Gateway Management] > [Configuration] > [Default Parameters])。

在“默认参数”(Default Parameters )菜单的“错误页面”部分中,设置要显示的 html 页面的文件名或发生错误时要重定向到的 URL。

0
0 196
文章 姚 鑫 · 十月 23, 2022 3m read

第二十五章 CSP Session 管理 - 选择策略时的注意事项

组的注意事项

本节包含创建身份验证组时要考虑的一些要点。

  1. 仅当决定必须通过会话对象共享数据时才使用会话共享。 By-ID 和登录 Cookie 共享更加强大和可预测。
  2. 创建组时,尽可能保持一致,以便为目标用户创建统一的行为。不要将应用程序同时放在 By-ID 组和 组中。使用不同的身份验证策略可能会导致意外行为。 By-ID 优先于 。因此,如果一个应用程序两者都有,它会保持同步 。
  3. 对组的所有成员使用相同的身份验证类型。特别是,如果组中的某些应用程序允许登录 而其他应用程序不允许,则通过用户名/密码进入组会验证整个组,而通过登录 输入只会验证部分应用程序。这可能会导致用户对为什么有时需要登录而有时不需要登录感到困惑。
  4. CSP 服务器认为每个应用程序都在一个身份验证组中。会话中的一个单独的应用程序形成一个单实体 身份验证组。)
  5. 尽量不要将未经身份验证的应用程序放在 By-ID 组中。
  6. 组很脆弱;使用 是一种更稳健的方法。由于有关组的所有信息(包括其共享数据)都包含在单个会话中,因此该组很容易丢失。这是因为会话可能会超时,即在特定时间后会话会自动销毁。如果用户离开他的计算机或使用不在 组中的应用程序,则会话可能会超时。如果组中的应用程序之一标记 ,则该组被分散。
0
0 114
文章 姚 鑫 · 十月 22, 2022 4m read

第二十四章 CSP Session 管理 - 认证架构

认证架构

安全上下文和粘性登录

应用程序在会话中运行。会话需要运行应用程序的安全上下文。安全上下文包含身份验证状态。

By-SessionsBy-ID Groups 有一个粘性登录,它会记住会话或组中使用的最后一个应用程序的安全上下文。如果组应用程序中的用户以其他用户身份登录,则会更新粘性登录。 (如果用户登录到未经身份验证的应用程序,则粘滞登录不会更新。)

在会话中跳转到应用程序时,会话会尝试使用适合目标应用程序的粘性登录。如果粘性登录与会话的当前安全上下文不匹配,并且应用程序可以接受粘性登录中的身份验证方法,则会话的安全上下文切换到粘性上下文中的安全上下文。

会话结束时,会话的粘性登录会丢失。当包含该组的任何应用程序的所有会话都结束时,该组的粘性登录将丢失。

初始登录后,组有一个关联的粘性登录对象,它在进入组的一个应用程序时尝试使用该对象。当组中的应用程序输入为 UnknownUser 时,粘性登录不会更新,因为这会将组中的所有其他应用程序移动到未经身份验证的安全上下文中。

如果粘性登录包含经过双重身份验证的用户,则该双重身份验证用于非双重身份验证应用程序,只要用户名身份验证在两个应用程序中匹配即可。

级联认证

CSP 服务器在尝试获取应用程序的身份验证信息时使用优先级。

0
0 96
文章 Yuxiang Niu · 十月 22, 2022 4m read

Cache锁的异常直接影响数据库进程运行,堆积的锁如果处理不及时会造成Cache性能异常,导致数据库访问受限或严重卡顿。本文主要以实例分析介绍Cache中常见锁的作用及其对应的处理方式,包括:系统锁、数据锁、Session锁、仪器锁、程序文件锁。其中数据锁异常需要及时处理。

查询Cache锁有两种方式:

1>可在System Management Protal[Home]>[Locks]中查看;

2>可在terminal端使用Do ^LOCKTAB命令下查看,如下图所示,此方式适用于锁表量达到10000条以上,Protal页面HTTP响应超时无法显示锁表时使用。

0
0 459
文章 姚 鑫 · 十月 20, 2022 4m read

第二十二章 CSP Session 管理 - Private Pages

CSP 提供了私有页面的概念。只能从同一 CSP 会话中的另一个页面导航到私有页面。私有页面对于想要限制对某些页面的访问的应用程序很有用。

例如,假设有一个名为 private.csp 的私有页面( 示例页面之一)。用户无法直接导航到 private.csp(例如,通过输入其 )。用户只能从另一个 页面中包含的链接导航到 。引用 页面中包含的链接不能是绝对 ,以 开头。只有相对于引用页面的路径才被私有页面方法正确加密/标记。即:下面的前两个链接将相同的令牌传递给目标私有页面 。

<A HREF='test2.csp'>Link to private page - relative path</A> <BR>
<A HREF='/csp/samples/test2.csp'>
       Link to private page - full application path</A> <BR>

此链接的散列方式不同,无法访问。

<A HREF='http://myserver/csp/samples/test2.csp'>
        Link to private page - absolute path</A>
0
0 118
文章 姚 鑫 · 十月 19, 2022 2m read

第二十一章 CSP Session 管理 - 身份验证和加密

身份验证和加密

在发送到 HTTP 客户端的页面上放置状态信息是很常见的。当从这些页面发出后续请求时,会将状态信息发送回服务器。很多时候,重要的是将状态信息放置在网页上,以便 a) HTTP 源的查看者无法确定状态信息的值,并且 b) 服务器可以验证返回的信息是,实际上,从同一服务器和会话发送出去。通过其加密服务,CSP 提供了一种易于使用的机制来实现这一点。

Session Key

可以使用加密密钥对服务器上的数据进行加密和解密。每个 都有一个唯一的会话密钥(可通对象 Key 属性中的 访问),用于加密会话数据。这种机制是安全的,因为会话密钥永远不会发送到 客户端;它作为 的一部分保留在 服务器上,位于对象中。

可以在类中使用 的 方法手动加密服务器上的值。可以随后使用 Decrypt 方法解密此值。

加密 URL 和 CSPToken

在某些情况下(如下所述),从 文件生成的类会自动加密发送到客户端的 值(对于手动创建的类,必须在类中调用 %CSP.Page的 方法才能执行此操作)。

例如,假设 文件包含定义指向另一个页面的链接的锚标记:

<a href="page2.csp?PI=314159">Page 2</a>

如果此

0
0 186
文章 姚 鑫 · 十月 19, 2022 7m read

CORS请求Request携带Cookie失败占用License解决方案

起因

  1. 因为是前后端分离的项目,前端使用的vue2,后端iris。需要获取cooike的,每次请求时携带,防止每次请求都占用一个。

  2. 登录认证,保持会话期间全局变量,超时退出。

现象

下图是如果不携带cookie每次请求都会新建一个并且占用一个license

image

解决过程

所以基于上述情况,需要每次获取响应的cookie,保存下来,下次请求再携带保存下来的。

如图Set-Cookie内容:

  • CSPSESSIONID - 为SessionID
  • - 服务器,负载均衡时会用到,如果不对应,则会报错。

后端方法为%CSP.Response的:

Method WriteHTTPHeaderCookies()
{
	#Dim c,cookie,port,cookiepath
	s ^yx("yx","UseSessionCookie") = %session.UseSessionCookie
	s ^yx("yx","CSPSessionCookie") = %session.CSPSessionCookie
	s ^yx("yx","SecureSessionCookie") = %session.SecureSessionCookie
	If $isobject($get(%session)),%session.UseSessionCookie,i%OutputSessionToken,%session.CSPSessionCookie'="" {
		Set cookie="CSPSESSIONID",cookiepath=i%CookiePath
		If $extract(cookiepath,*)'="/" Set cookiepath=cookiepath_"/"
		If $data(%request.CgiEnvs("SERVER_PORT"),port) Set cookie=cookie_"-SP-"_port
		Set cookie=cookie_"-UP-"_$translate($extract(cookiepath,2,*),"/","-")
		Set cookie=cookie_"="_$select(i%OutputSessionToken=2:"",1:%session.CSPSessionCookie)_"; path="_$zcvt($zcvt(cookiepath,"O","UTF8"),"O","URL")_"; "_$select(%session.SecureSessionCookie:" secure;",1:"")
		if i%UseHttpOnly {
			Set cookie=cookie_" httpOnly;"
		}
		Write "Set-Cookie: "_cookie,!
		$$$SysLogTag(2,"CSPResponse","[WriteHTTPHeaderCookies] Session cookie: "_cookie,"", %request.RequestId)
		s ^yx("Set-Cookie:") = cookie
		
		Set %session.CookiePath=$get(cookiepath)
	}

	Set c=""
	For {
		Set c=$order(i%Cookies(c)) Quit:c=""
		Set name=i%Cookies(c,"n")
		Write "Set-Cookie: ",name,"=",i%Cookies(c,"v"),";"
		Write:i%Cookies(c,"e")'="" " expires=",i%Cookies(c,"e"),";"
		Write:i%Cookies(c,"p")'="" " path=",i%Cookies(c,"p"),";"
		Write:i%Cookies(c,"d")'="" " domain=",i%Cookies(c,"d"),";"
		Write:i%Cookies(c,"s") " secure;"
		Write:i%Cookies(c,"h") " httpOnly;"
		Write !
	}
}
0
0 481
文章 姚 鑫 · 十月 18, 2022 3m read

第二十章 CSP Session 管理 - 状态管理

状态管理

因为 HTTP 是无状态协议。为 Web 编写的应用程序必须使用特殊技术来管理应用程序上下文或状态。 CSP 提供了许多用于状态管理的机制。这些中的每一个都可能适用于特定情况。

请求之间的跟踪数据

应用程序中状态管理的基本问题是跟踪连续 请求之间的信息。有许多可用的技术,包括:

  • 使用隐藏的表单字段或 URL 参数在单个页面上存储数据
  • 将数据存储在客户端的 cookie
  • 将数据存储在服务器上的对象中的 %CSP.Session
  • 在 数据库中存储数据

在页面中存储数据

要将状态信息存储在页面中,必须放置它以便来自该页面的后续请求包含该信息。

如果页面通过超链接发出请求,则数据应放置在超链接的 中。例如,这是一个包含在 文件中定义的状态信息的超链接:

当 为包含此链接的页面提供服务时,表达式 #(data)# 将替换为发送给客户端的文本中的服务器变量 的值。当用户选择这个指向 的链接时, 服务器可以通过 对象访问 的值。如果需要, 可以对此类数据进行编码。

如果页面包含表单,可以将状态信息放置在隐藏字段中:

与超链接示例一样,当将此表单发送到客户端时,表达式 将替换为变量 的值。当用户提交此表单时,可以通过 对象获得 的值。

0
0 137
文章 姚 鑫 · 十月 17, 2022 3m read

第十九章 CSP Session 管理 - %CSP.Session 对象

对象中的 %CSP.Session 包含有关当前Session的信息以及以编程方式控制会话各个方面的方法。

User Session Data

可以使用其 Data 属性将 中的应用程序特定信息存储在对象中。数据是一种多维数组属性,可让关联多维数组中的特定信息。该数组的内容会在会话的整个生命周期内自动维护。

可以像使用任何其他 ObjectScript 多维数组一样在对象 属性中使用 %CSP.Session

例如,如果在 方法中执行以下代码:

 Set %session.Data("MyData") = 22

然后对同一会话的后续请求(无论哪个类处理请求)在对象中的 中看到此值:

注意:理解为全局变量。

在 中存储应用程序特定数据的能力是一项非常强大的功能,但应该正确使用。进一步讨论请参阅“状态管理”部分。

设置用户数据 - 设置命令

要在对象的 %CSP.Session 中存储数据(仅文字数据 — 不是对象引用),请使用 数组中的每个节点都可以包含最多 个字符的字符串。

 Set %session.Data("MyData") = "hello"
 Set %session.Data("MyData",1) = 42
0
0 118
文章 姚 鑫 · 十月 16, 2022 4m read

第十八章 CSP Session 管理 - 与 CSP.Session 的Sessions

`` 是一种无状态协议;每个请求都不知道以前的请求。虽然这适用于为用户提供简单静态内容的网站,但它使得开发交互式动态 Web 应用程序变得困难。为了解决这个问题,CSP 提供了所谓的Session 管理。

与 的

Session 话表示在特定时间段内从特定客户端到特定应用程序的一系列请求。

CSP 自动提供会话跟踪;无需执行任何特殊操作即可启用它。 CSP 应用程序可以通过对象中的 %CSP.Session 查询和修改其会话的各个方面。 服务器通过 变量使该对象可用。

Session 会话创建

当 客户端向 CSP 应用程序发出第一个请求时,会话开始。

创建新session时, 服务器会执行以下操作:

  1. 创建一个新的会话 号。
  2. 酌情执行许可检查。
  3. 在对象(持久)中创建 的新实例。
  4. 调用当前事件类(如果存在)的 OnStartSession 方法。
  5. 创建一个 以便在会话过程中跟踪来自 客户端的后续请求。如果客户端浏览器禁用了 , 会自动使用 重写(在每个 中放置一个特殊值)来跟踪。

对于的第一个请求,对象中的 的 属性设置为 。对于所有后续请求,它设置为 :

0
0 166
文章 姚 鑫 · 十月 15, 2022 2m read

第十七章 CSP 中的 HTTP 请求 - %CSP.Response 对象和 OnPreHTTP 方法

%CSP.Response 对象和 OnPreHTTP 方法

可以使用对象中的 %CSP.Response 控制将哪些响应标头发送回 HTTP 客户端。 CSP 服务器自动创建此类的一个实例,并将对它的引用放在变量 中。

由于 对象控制 标头,因此通常在类中的 %CSP.Page 的 方法中设置其属性。例如,要重定向传入的 请求,请定义以下 方法:

Class MyApp.Page Extends %CSP.Page
{
// ...

ClassMethod OnPreHTTP() As %Boolean
{
    Set %response.ServerSideRedirect = "C:\CacheSys\csp\samples\redirect.csp"
    Quit 1
}
}

如果使用 CSP 类创建 CSP 页面,请使用以下代码设置标题值:

Class MyPage Extends %CSP.Page
{
ClassMethod OnPreHTTP() As %Boolean
{
    Do %response.SetCookie("name","value")
    Quit 1
}
0
0 116
文章 姚 鑫 · 十月 14, 2022 3m read

第十六章 CSP 中的 HTTP 请求 - %CSP.Request 对象

%CSP.Request 对象

CSP 服务器响应 HTTP 请求时,它将有关传入请求的信息打包到对象中的 %CSP.Request 实例中。可以使用变量 来引用此对象。

URL 属性

要查找传入 请求的 (不包括查询字符串),对象中使用 %CSP.Request 的 属性:

 Write "URL: ", %request.URL

数据属性和 参数

可能包含参数列表(也称为 查询)对象中的 通过其 属性使这些可用。

例如,假设传入的 URL 包含:

/csp/user/MyPage.csp?A=10&a=20&B=30&B=40

可以使用以下命令在服务器上检索这些参数:

 Write %request.Data("A",1)    // this is 10
 Write %request.Data("a",1)    // this is 20
 Write %request.Data("B",1)    // this is 30
 Write %request.Data("B",2)    // this is 40
0
0 172
文章 姚 鑫 · 十月 13, 2022 2m read

第十五章 CSP 中的 HTTP 请求 - 处理 CSP 错误

处理 CSP 错误

%CSP.Error是默认的 CSP 错误页面。将其用作创建的任何错误页面的超类。可以使用 %CSP.Error中提供的功能从错误中提取信息。

在授予许可证之前处理 错误

如果已经有一个现有会话并且用户尝试转到一个未找到的页面, 将显示标准错误页面,因为该会话已经有一个许可证。

如果 CSP 应用程序还没有许可证,并且发生以下任何错误,则 CSP 默认显示标准 Web HTTP/1.1 404 Page Not Found 错误消息。可以通过在错误页面(通常是 %CSP.Error的子类)上为应用程序设置以下参数来更改在授予许可之前遇到错误时显示的页面。

如果生成以下错误,CSP 会查看 参数的值:

Cannot grant license.

可以有以下两个值:

  • "" — 返回 HTTP/1.1 404 Page Not Found 错误(默认)

  • 静态 HTML 页面的路径 — 显示命名的静态页面,例如 /csp/samples/static.html

如果生成以下任何错误, 会查看 参数的值:

可以有以下三个值:

  • — 返回 错误(默认)
  • 1
0
0 243
文章 姚 鑫 · 十月 12, 2022 3m read

第十四章 CSP 中的 HTTP 请求 - CSP.Page 类

CSP 服务器上,所有 HTTP 请求都通过调用由类中的 %CSP.Page 定义的方法来处理。类中的 从不直接处理请求本身;它只是定义了处理 请求所需的接口。实际的事件处理的 的子类完成(手动创建或作为处理 源文件的结果)。

%CSP.Page 的子类永远不会被实例化;也就是说,不会在对象中创建 %CSP.Page%CSP.Page 定义的方法都是类方法,不需要对象即可调用。正如我们将看到的,这些方法所需的任何状态信息都由 服务器管理的其他对象(例如 和对象中的 )提供。

Page 方法

在 服务器确定类中的哪个 %CSP.Page 应该处理请求后,它会设置适当的处理上下文,然后调用该类的 Page 方法。设置处理上下文包括重定向标准输出设备 (),以便将所有输出(使用 命令)发送回 客户端并创建任何所需对象的实例(例如 、 和 对象)或局部变量。

方法处理对 请求的完整响应。它通过按顺序调用回调方法 、 和 来做到这一点。这些被称为回调方法,因为子类可以覆盖它们以提供自定义行为。

方法负责写出 响应的标头。这包括内容类型和 等信息。默认行为是将内容类型设置为 。在需要更直接地控制响应标头的情况下,通常只需要覆盖 方法。

方法执行响应 请求的大部分工作。

0
0 208
文章 姚 鑫 · 十月 11, 2022 3m read

第十三章 CSP 中的 HTTP 请求 - CSP 服务器事件流

CSP 服务器收到来自 CSP 网关的请求时,它会确定该请求是针对静态页面还是针对 CSP 类的。如果是静态页面,它会立即将页面发回。如果是针对 类,它会执行以下操作:

  1. 确定此请求属于哪个会话。如果没有,它会启动一个新会话。
  2. 确保在正确的 Caché 命名空间中处理请求。
  3. 确保对象中正确的 %CSP.Session可用,并根据 请求中包含的信息在对象中创建 %CSP.Request 的实例。如果需要任何解密,它也会这样做。
  4. 构造 对象以允许应用程序修改响应标头。
  5. 确定应由哪个类处理请求并调用其 方法(该方法又调用 回调方法)。

CSP 服务器 URL 和类名称解析

服务器通过解释其 来确定将 HTTP 请求分派到哪个类。 将 分解为以下组件:

Component Purpose
http:// 协议
localhost 网络服务器地址
[] 可选, 服务器正在运行的端口号;默认为端口
/csp/samples/ 目录
文件名和扩展名
查询

协议和服务器地址由 服务器处理,与 CSP 服务器无关。该目录用于确定 URL 引用的 应用程序。每个 配置都可以定义多个 应用程序,这些应用程序由 的目录部分标识。每个

0
0 142
文章 姚 鑫 · 十月 10, 2022 3m read

第十二章 CSP 中的 HTTP 请求 - CSP 运行时环境

CSP 的主要任务是提供动态内容以响应传入的 (超文本传输协议)请求。本节介绍 CSP 如何处理 请求的基础知识。

是一种简单的协议,其中客户端向服务器发出请求。 是一种无状态协议;客户端和服务器之间的连接只持续为服务请求所需的时间。每个 HTTP 请求都包含一个请求标头,该标头指定请求类型(例如 或 )、一个 和一个版本号。请求还可能包含附加信息。 自动确定它应该处理哪些 请求,将它们分派到运行在 服务器上的适当类,并将请求信息打包成易于使用的对象(例如对象中的 )。

CSP 运行时环境

下图显示了 和 请求的架构:

应用程序的运行时环境包括以下内容:

  • HTTP 客户端(例如 Web 浏览器)
  • HTTP 服务器( 服务器,例如 或 )
  • 网关( 服务器的 Caché 插件)
  • 服务器( 服务器在其上运行请求的 应用程序)

HTTP 请求处理

下图说明了 处理 请求时的事件流:

  1. 浏览器(或类似的 客户端)发出 请求。
  2. 服务器确定这是一个 请求并将其分派到 网关(安装在 Web 服务器上)。 2a 服务器可能会提供静态内容,具体取决于应用程序配置。
  3. 网关重新打包请求并将其发送到正确的缓存服务器。
0
0 169
文章 姚 鑫 · 十月 8, 2022 2m read

第十章 CSP 架构 - Category

Category: AllowPrefix

如果应用程序依赖于调用以同一组字符开头的多个类或包,请使用AllowPrefix选项。

重要提示:如果应用程序依赖于调用上面列出的以外的任何类,则使用它可能是不安全的。建议确定是否需要调用此类,并为部署执行风险评估,以便了解使类可用的含义。

要使给定的Web应用程序能够调用以相同字符集开头的类或程序包,请在命名空间中使用以下命令:

Set ^SYS("Security", "CSP", "AllowPrefix", "web-app-name", "prefix") = value

其中

  • Web-app-nameWeb应用程序的名称,后跟一个尾随斜杠。

要使所有Web应用程序都能使用给定的类或包,请将web-app-name指定为;在这种情况下,可以省略括起来的引号。

  • 前缀是名称的前几个字符。

  • 值为10

如果将其指定为1,则Web应用程序可以调用这些类(或包)。

如果将其指定为,则此Web应用程序无法调用这些类(或包)。

例如,要使应用程序能够调用整个包,请使用以下命令:

请注意,前缀是 ,前缀中的句点表示应用程序无法访问等包。但是,应用程序可以访问包和。

再举一个例子,要使所有应用程序都能够访问以开头的所有包,请使用以下命令:

再举一个例子,假设 应用程序应该能够访问 % 包中除类

0
0 148
文章 姚 鑫 · 十月 7, 2022 4m read

第九章 CSP 架构 - CSP 应用程序设置

CSP 应用程序设置

CSP 服务器接收到传入的 HTTP 请求时,它使用本地 CSP 应用程序设置来确定如何处理请求。本节介绍 如何使用 应用程序设置处理 应用程序请求。

启用对 页面的应用程序访问

以下规则管理对页面和类的访问:

  1. 默认情况下,允许用户应用程序访问以下页面:
  • 允许 /csp/sys/ 应用程序及其所有子应用程序的页面
  • 允许使用 isc/studio/templates//isc/studio/usertemplates/ 应用程序的页面
  1. 默认情况下,允许用户应用程序访问所有非 % 类
  2. 用户应用程序还可以访问以下类:
  • %CSP.Broker, , %CSP.Login, , 被允许
  • 和 是允许的,有以下附加条件
    • 不允许所有其他 %ZEN.*
    • 允许所有其他 %Z*
  • 允许所有 类

除了检查 应用程序中的设置外,还会检查允许的类。可以通过导航到管理门户上的系统管理 > 安全 > 应用程序 > Web 应用程序来查看和更改应用程序设置。因此,类引用必须通过两组测试才能被允许。

要允许访问其他类,请在 命名空间中配置 ,其中 是 、 或 。以下部分描述了这些选项

重要提示:首先应用默认规则,然后按列出的顺序应用类别来完成检查。此外,每个关键字都可以被多次调用。

0
0 189
文章 姚 鑫 · 十月 6, 2022 4m read

第八章 CSP 架构 - CSP 网关配置

CSP 网关配置

CSP 网关是安装在 Web 服务器上并由其加载的 DLL 或共享库。 网关检测对扩展名为 或 的文件的任何请求,并将它们发送到定义的 服务器进行处理。

CSP 网关管理器

可以使用 网关管理器( 网关管理页面)或直接编辑其配置文件 csp.ini 来配置 网关。

网关管理器是一个小型 应用程序,可以在浏览器中使用它。您可以通过导航到系统管理 > 配置 > CSP 网关管理来访问 网关管理器。默认情况下,它会访问专用 服务器的 网关管理器。

要访问生产 服务器的 网关管理器,请根据需要通过替换 或 localhost:<port_no> 来更改 。

有关配置 网关的信息,请导航至系统管理 > 配置 > CSP 网关管理,然后单击帮助。有关更多详细信息,请参阅 网关配置指南。

注意:CSP Web 网关管理页面的本地化仅基于安装的 的内容(如果有)。如果不存在本地化文件,则 管理页面默认使用嵌入的英文文本。浏览器的语言设置对此机制没有影响。

定义服务器访问

注意:为防止运行时错误,对于通过 运行的高可用性配置, 建议使用启用了粘性会话支持的硬件负载平衡器。

可以定义此 网关可以访问的服务器列表(可能运行 CSP 应用程序的

0
0 132
文章 姚 鑫 · 十月 5, 2022 3m read

第七章 CSP 架构 - URL 的 Web 服务器配置

URLWeb 服务器配置

提供了一个默认的 /csp 虚拟目录来运行 应用程序。如果正在运行多个 Caché 实例,它还提供了一个默认虚拟目录 以供使用。如果正在运行多个 实例并使用虚拟目录 访问 应用程序,而之前没有 /,它将访问最后安装的 版本。如果计划允许使用以 http://localhost/csp 或 http//localhost/cacheinstance/csp 开头的应用程序路径调用所有 应用程序,则无需在 Web 服务器中进行任何更改配置。

如果要创建一个应用程序路径不是以 或 /cacheinstance/csp 开头的 CSP 应用程序,则需要在 服务器配置文件条目中进行更改,别名 。

下表显示了需要更改的配置文件。

网络服务器 配置文件
ApacheHP 安全网络服务器 UNIX®: Windows: \conf\httpd.conf
如“在 服务器上配置新 ”中所述定义虚拟目录。

下表显示了使用 服务器和 实例的组合访问 页面的示例:

0
0 184
文章 姚 鑫 · 十月 3, 2022 2m read

第五章 CSP 架构 - 组件,信息流

CSP 组件:Web 服务器、CSP 网关、 服务器

使用三个软件组件: 服务器、CSP 网关和 服务器(在 服务器上运行):

  • CSP 组件

服务器和CSP服务器可以由一台或多台计算机实现。在开发过程中,所有三个组件(Web 服务器、 网关和 服务器)可能都位于一台 上。在大规模部署中,可能有多个 服务器和 服务器采用两层或三层配置。

这些组件( 服务器、 网关、 服务器)视为各有一个。它将 描述为好像只提供 页面,尽管 也可以提供 页面,以及其他文本格式和二进制格式,例如图像。

每个组件的作用

服务器是一个软件实用程序,它执行以下操作:

  • 接受传入的 HTTP 请求,通常来自浏览器
  • 检查权限
  • 可以提供静态内容
  • CSP 网关发送对 内容(以 或 结尾的 )的请求

CSP 网关是一个共享库、一个 文件或一个 脚本。它执行以下操作:

  • 确定将请求发送到哪个 服务器。
  • 将请求发送到正确的 服务器。
  • 维护与 服务器的连接(以避免必须不断打开新连接)。

服务器是一个运行在 服务器上的进程,专门用于处理来自 网关的请求。它执行以下操作:

  • 接收应用程序的 请求
  • 检查应用程序配置设置(在管理门户中设置并保存在 文件中)。
0
0 191
文章 姚 鑫 · 十月 2, 2022 2m read

第四章 Caché 服务器页面简介 - 通过 html 创建 csp 页面

创建基于 HTML 标记的 CSP 页面

要使用 HTML 文件创建 页面,请执行以下操作:

  1. 启动 Studio 并选择 File > New > > 。
  2. 将新 文件的内容替换为以下内容:
<html>
<body>
<b>Hello, World!</b>
</body>
</html>
  1. 选择文件 > 保存。
  2. 在显示的另存为窗口中,双击默认 CSP 应用程序 csp/user
  3. 输入文件名 Hello.csp 并单击另存为以保存文件。
  4. 在 窗口中,选择查看 > 网页。

与前面的示例一样,会看到 显示在浏览器中。

CSP 应用程序可以由单个 页面或一组页面组成。 CSP 应用程序作为一个单元,使用适用于整个应用程序的设置。系统提供 作为默认的 应用程序。

还可以使用文本编辑器或 编辑器创建 文件。将此文件作为 Hello.csp 保存在本地目录 中(其中 是安装 的位置)。

页面的工作方式如下:

  1. 浏览器向本地 服务器发送 请求
  2. 服务器将此请求传递给 网关(连接到 服务器), 网关又将请求传递给 服务器。
  3. 服务器查找文件 ,并将其交给 编译器。
  4. 编译器创建一个名为 的新类,该类具有写出 文件内容的 方法。 (它实际上生成一组方法,每个方法依次从
0
0 296
文章 姚 鑫 · 十月 1, 2022 2m read

第三章 Caché 服务器页面简介 - 通过 cls 创建 csp 页面

创建第一个 CSP 页面

本节介绍如何以两种不同的方式创建 Hello, World CSP 页面:

创建基于类的 CSP 页面

通过创建 的子类并覆盖其 OnPage 方法来创建 页面。通过此方法写入主设备的任何输出都会自动发送到 浏览器并显示为网页。

  1. 打开Studio
  2. 选择 File > New Project 在本地数据库 USER 命名空间中创建一个新项目。
  3. 在向导的第一页上,输入 作为包名,并输入 作为类名
  4. 在第二页上,选择 CSP 作为类类型。
  5. 单击完成。可以在 类编辑器中看到新的 CSP 类定义:
  1. OnPage 方法中,替换注释:
 ; To do...

使用 语句:

  1. 使用 Build > Compile 保存并编译新类。
  2. 选择视图 > 网页。

会在浏览器中看到 Hello, World

这个 页面也是一个 应用程序,其工作原理如下:

  1. 浏览器向指定命名空间中的本地 Web 服务器发送对 Test.Hello.cls 的请求。

  2. 服务器将此请求传递给 网关,CSP 网关将请求传递给 服务器。在我们的例子中,浏览器、 服务器和 应用程序服务器都运行在同一台机器上。在实际部署中,这些可能位于不同的机器上。

  3. 服务器查找名为 的类并调用其

0
0 172
文章 姚 鑫 · 九月 30, 2022 2m read

第二章 Caché 服务器页面简介 - 你应该知道

你应该知道什么

要高效使用 CSP,应该熟悉以下内容:

  • Caché objects and ObjectScript

  • HTML

  • JavaScript

CSP Samples

Caché 附带一组示例CSP 页面。要查看这些:

  1. 打开

  2. 要查看 示例,请确保计算机上的 Web 服务器正在运行。

  3. 启动浏览器并转到 CSP 示例菜单(使用位于以下位置的私有 Web 服务器:http://localhost:57772/csp/samples/menu.csp或位于以下位置的外部 Web` 服务器:http://localhost /csp/samples/menu.csp 。

  4. 如果安装的 具有正常或锁的安全功能,则可能会显示登录页面。如果是这样,请登录。

  5. 显示示例 页面的列表以及每个页面的简短描述。单击感兴趣的任何内容。

文档

可以在此处找到有关 的文档:

  • 使用 描述了如何创建 页面
  • 使用 ZEN 描述了如何使用 ZEN,这是一个在 之上工作的包,用于使用预构建的页面对象进行更快速的 Web 应用程序开发。 文档包括使用 组件、开发 应用程序和使用 报告。
  • ,对所有 标签的引用
  • CSP 示例菜单,显示了许多 页面示例。
  • 服务器页面快速入门教程让入门。
0
0 223
文章 姚 鑫 · 九月 29, 2022 3m read

第一章 Caché 服务器页面简介 - 什么是CSP

Caché Server Pages (CSP) 既是用于构建交互式 CSP 应用程序的架构又是工具集。 CSP 技术允许构建和部署高性能、高度可扩展的 应用程序。 允许动态生成网页,通常使用来自 数据库的数据。 “动态”意味着每次从最近更改的数据源请求同一页面时,它可能会提供不同的内容。

用途广泛。它可以

  • 显示每分钟都在变化的库存数据。
  • 支持拥有数千名活跃用户的网络社区。
  • 根据存储在 Caché 数据库中的用户信息个性化页面。
  • 根据不同用户的要求和安全权限,根据用户数据为不同用户定制页面。
  • 提供 HTMLXML、图像或其他二进制或文本数据。
  • 提供快速性能,因为它与高性能 数据库紧密耦合。

非常适合数据库应用程序。除了提供对内置 数据库的快速访问之外,它还提供了许多基于 Web 的数据库应用程序必不可少的功能,包括

  • 会话管理
  • 页面认证
  • 能够从网页中执行交互式数据库操作。

支持两种风格的 开发。

  • 为了使用类开发应用程序,CSP 提供了一个对象框架。
  • 为了使用 文件开发应用程序,CSP 提供了一种基于 的标记语言,允许在网页中包含对象和服务器端脚本。可以在一个应用程序中结合这两种技术以获得最大的灵活性。

CSP 和 Zen

是一个应用程序框架,用于快速创建包含在 和 中的数据丰富的

0
0 466