Delphi 写 WebService 架构的三层程序如何维护 Session

使用Delphi调用WebServices接口的简单应用实例  <span style="font-family: function() { var id = (this._style >> 24) & 0xff; color: #000000; font-size: medium;">使用Delphi调用WebServices接口的简单应用实例 Delphi从6.0就开始支持Web Services的开发和应用了,本文通过使用Delph 阅读详情

问题由来:

如果是基于 TCP/IP 长连接的远程服务,比如 Delphi 新版推荐的 DataSnap,它支持基于客户端和服务器端的 TCP 长连接,服务器端甚至可以通过这个连接回调客户端,向客户端发起主动通知。那么,一个 Session 就是一个这样的长连接。

但是,WEB 访问,是短连接。一次操作,就建立一次连接,操作完成,连接断开。下次操作,重新连接。因此,假设用户登录过后,继续其它操作,服务器端如何知道下次操作的这个连接还是上次登录的那个客户端?

在使用网页访问的 WEB Server 上面,有几种做法:

1. 使用 Cookie 去追踪客户端;

2. 在网页的 Form 里面使用隐藏的字段,也就是不显示在页面上,但页面前端 HTML 代码里有,页面提交后,服务器端可以读到这样的隐藏字段的内容,知道这个页面是之前登录的谁;

3. 使用 URL 参数。类似 http://abcd.com/readDoc?docNumb=123456;  这里问号后面就是 URL 的参数。很多网站使用这样的方式。

4. 可能还有其它什么方式我不知道。请知道的留言。

那么,同样是基于 WEB 访问的 WebService,使用 Delphi 来开发的时候,采用什么方式?

---------------

Delphi 可以采用的方式:

1. SOAP Header:网上能搜索到的方式,都讲使用 Soap Header,需要自己定义一个继承自 TSoapHeader 的类,用来存放用户登录后从服务器端取得的 Session 值或者干脆就是客户端自己的用户名和密码,总之就是通过这个 Soap Header 传递参数给服务器端,服务器端代码读这个 Soap Header 获得参数可以知道客户端是谁。

2. Cookie:这个是我自己摸索出来的,本来挺好用的一个功能,但在新版 Delphi 底下,稍微麻烦一点。

3. URL 参数。很简单,也很好用。但网上搜索 Delphi WebService Soap 等,没有相关信息。可能是太过简单?

----------------------------

基于 Soap Header 的方式,最大的问题是,客户端每次调用服务器端的方法时,都要事先调用一次发送 Soap header 的方法。也就是代码的量增加了。就算是客户端通过 TSoapConnection 去打开一个 TClientDataSet 或者提交一个 TClientDataSet 都需要先执行一下发送 Soap Header 的代码。

使用 Cookie,因为 Cookie 对客户端来说是透明的,客户端完全无需处理。只要服务器端为客户端设置了 Cookie,以后每次客户端的访问,服务器端都可以读到这个 Cookie,通过 Cookie 可以知道这个客户端是谁。非常好的办法。我之前也写过一篇博客介绍怎么使用 Cookie:Delphi 的 WebService 的 Cookie 操作

使用 Cookie 的问题:

1. 为了方便操作,在客户端,通常我会放一个 THTTPRIO 和一个 TSoapConnection,使用 THttpRio 来调用服务器端的接口方法,通过 TSoapConnection 来使用基于 MIDAS 的三层数据库架构,无需写代码就能获得数据,提交数据,减少代码工作量。

2. 在上述情形下,使用 HttpRio 去调用服务器端的登录方法,服务器端在该方法里面检查客户端提交的用户名密码等参数,登录成功后,服务器端为客户端创建一个 Cookie 记录客户端的参数。以后,不管是 HttpRio 调用服务器端接口,还是 ClientDataSet 通过 SoapConnection 去读写数据库,服务器端都能读到之前为客户端创建的 Cookie,根据其中参数,知道客户端是谁。

3. 但是,新版的 Delphi ,使用 HttpRIO1 去调用服务器端方法由服务器端创建的 Cookie,只能是这个 HttpRio1 再次调用服务器端其它方法时,服务器端才能读到 Cookie;如果使用 HttpRIO2 或者 SoapConnection1 去操作服务器端,服务器端无法读到之前创建的 Cookie。也就是说,新版 Delphi 的客户端里面的多个 HttpRio 和 SoapConnection 实例,没有共享服务器端创建的 Cookie。

3.1. 解决上述问题的方法稍微麻烦点,那就是即便是调用服务器端的方法,也使用 SoapConnection1.RIO 来调用,而不是另外拿一个 HttpRio1 来调用。但是,要让 SoapConnection1.RIO 去调用服务器端的接口方法,就需要:

  SoapConnection1.Connected := False;
  SoapConnection1.SOAPServerIID := '{A4E625D6-1BC4-4335-BEF4-669113CA65B4}';  //这个 ID 是你用 Delphi 写的 WebService 服务器端的接口的 IID
  SoapConnection1.Connected := True; //设计期关掉连接。运行期设置这个为 True

关于上述方法,Delphi 的官方帮助是这样说的:

If the server includes more than one remote data module, you must indicate the target data module's interface (an IAppServerSOAP descendant) so that TSOAPConnection can identify the remote data module you want to use. There are two ways to do this:

  • Set the SOAPServerIID property to indicate the interface of the target remote data module. This method works for any server that implements an IAppServerSOAP descendant. SOAPServerIID identifies the target interface by its GUID. At runtime, you can use the interface name, and the compiler automatically extracts the GUID. However, at design time, in the Object Inspector, you must specify the GUID string.
  • If the server is written using the Delphi language, you can simply include the name of the SOAP data module's interface following a slash at the end of the path portion of the URL. This lets you specify the interface by name rather than GUID, but is only available when both client and server are written in Delphi.

---------------------------------------------------------------

使用 URL 参数:

我们使用 HttpRio1 或者 SoapConnection1去连接服务器端,如果服务器端是用 Delphi 写的,通常只需要设置其 URL 为:

https://127.0.0.1:8080/soap

就可以和服务器端交互。

那么,当客户端调用服务器端的登录方法,服务器端可以为客户端产生一个 Session ID,比如一串数字 13579,通过这个登录函数返回给客户端,那么,客户端就可以把上述的 URL 改为:https://127.0.0.1:8080/soap?session=13579

那么,不管是 ClientDataSet1.Open 还是 ClientDataSet1.ApplyUpdates 还是使用 HttpRIO1 去调用服务器端的一个接口方法,在服务器端,都可以读到这个 session=13579;客户端只需要一行代码,也就是修改 URL,后面的所有操作都自动提交,无需其它代码了。服务器端读到这个参数的方法是:

ID := GetSOAPWebModule.Request.QueryFields.Values['session'];

解释一下:

在服务器端,GetSOAPWebModule 声明在 Soap.WebBrokerSOAP 单元,是一个全局函数,返回的是 TWebModule,只要 uses Soap.WebBrokerSOAP;就可以使用它。Request 代表的是客户端的请求,通过它可以读到客户端的 URL 参数。之前我们读客户端的 Cookie 也是使用 GetSOAPWebModule 来获得的。

实际上,在 Delphi 里面使用 WebBroker 框架写一个使用浏览器页面访问的 WEB Server 程序,也是通过这个 TWebModule 来操作对客户端的请求 Request 和要发送给客户端的内容 Response 的。

Delphi编写soap服务器与客户端程序 Delphi编写soap服务器与客户端程序使用三层结构开发客户机、服务器软件已成为c/s系统中的主流;下面是自己在开发系统中的一些体会;本文已delphi7(windows)或kylix3(linux9)为环境描述:1、编写服务器程序      首先,看看soap服务器的建立,在delphi7中的新建栏目中,选择“ WebServices”如下图,选择“Soap Server Applicat 阅读详情

相关推荐

Delphi开发WebService实战指南

本文还有配套的精品资源,点击获取 简介:Delphi作为一种面向对象的编程环境,在Windows应用开发中表现出色。本指南将分享使用Delphi创建Web服务的经验,涉及SOAP和REST协议,提供从基础概念到高级技巧的全面教程。文档包含8页的PDF格式内容,详细阐述了如何在Delphi环境中构建和部署Web服务,包括使用Indy和WebBroker组件。此外,还提供了关于...

weixin_35987118的博客 1526

delphi D10.X 生成WebService接口介绍

概述 WebService是一种跨编程语言和跨操作系统平台的远程调用技术。他是基于http的soap协议传输数据 webservice=soap=http+xml,webservice协议就是有http+xml组成的,其中xml中会用到wsdl,而wsdl是描述语言xml中的一种格式。 WebService交互的过程就是,WebService遵循SOAP协议通过XML封装数据,然后由Http协议来传输数据。 这是一种很早就出现的数据交互技术,现在的系统中很少再使用到,在用的多数是原有系统沿用下来的。 当年使

tanqth的专栏 1万+

Delphi实现的独立WebService服务设计

Delphi是一种强类型、编译式的编程语言,具有高效的开发效率和跨平台的特性,一直以来都是IT行业在开发桌面和服务器应用的首选语言。其核心优势之一是提供了丰富的组件库,极大地简化了开发过程。在WebService开发中,Delphi语言能够快速搭建服务端应用,实现复杂的网络通信。WebService是一种基于Web的分布式计算技术,它允许应用程序通过网络使用标准化的XML消息传递机制进行交互。在Delphi中,开发者可以利用WebService简化应用程序之间的数据交换,构建松耦合的服务体系结构。

weixin_34456923的博客 1387

DELPHI通过WebService进行数据交互

WebService是一种可以跨语言和平台的数据交互模式,使用非常广泛,与JSon数据格式结合,更是当前非常流行的一种模式,本章针对DELPHI通过WebService进行数据的交互做一个相对简单例子应用。到当前为止,我们的服务端就创建好了,不过是个空的服务端,什么接口都没有,但我们可以运行一下看看。好了,到当前为止,我们服务端正式完成,F9运行并Star服务,不要关闭,我们开始设计客户端。好了,我们第一个函数创建完成,为了避免麻烦,我们把第二个函数也一起完成后,再来建立客户端。

2803

Delphi中Web Service接口的创建与客户端调用实例

Delphi,作为一种广泛应用于Windows平台的集成开发环境(IDE),由Borland公司于1995年首次发布。它的历史沿革和功能特点,使其在快速开发Web Service领域独树一帜。Web Service是一种基于Web的分布式计算技术,它提供了一种机制,允许应用程序通过网络以标准化的通信协议(如HTTP、SOAP等)进行交互。Web Service的核心功能是让不同的系统之间能够通过互联网交换信息和数据。

weixin_35639680的博客 911

用Delphi-实现WebService

用Delphi-实现WebService 用Delphi-实现WebService 用Delphi-实现WebService

Delphi WebService 使用 HTTP Header 管理 Session

使用 Delphi 的 WebBroker 框架可以开发标准的 Web Server 程序。使用 Delphi 的 SOAP 框架,可以开发支持 SOAP 标准的 WebService 服务端程序。此框架建立的 WebBroker 框架之上。使用 Delphi 可以开发客户端程序,去调用 WebService 服务器提供的 SOAP 函数。同时也可以去调用 WebBroker 开发的 Web Server 提供的 RESTfull 的 URL 接口。

pcplayer的博客 275

使用广播星历进行 GPS 卫星位置的计算

目录1.计算卫星运动的平均角速度 n2.计算观测瞬间卫星的近地点角3.计算偏近点角4.计算真近点角 f5.计算升交角距 6.计算摄动改正项7.进行摄动改正 8.计算卫星在轨道面坐标系中的位置9.计算观测瞬间升交点的经度 L10.计算卫星在瞬时地球坐标系中的位置11.计算卫星在协议地球坐标系中的位置使用广播星历进行GPS卫星位置的计算的详细步骤如下:关于在广播星历中各参数的分布情况可以参考下图:首先根据广播星历中给出的参数 计算参考时刻(TOE) 的平均角速度 式中,GM为万有引力常数 G 与地球总质量

qq_43381998的博客 5567

Delphi Soap WebService 的 HTTP Cookies

前情提要: Delphi SOAP WebService 服务器端多个 SoapDataModule 的做法 Delphi 写 WebService 架构的三层程序如何维护 Session Delphi 的 WebService 的 Cookie 操作 问题起因 在使用 Delphi 开发 SOAP WebService 服务器端和客户端的过程中,我们可以使用 HTTP Cookies 来实现用户身份验证,或者一些【状态】的传递,而客户端基本上不需要写代码。采用其它方法,每次客户端需要和服务.

pcplayer的博客 917

来自工业界的知识库 RAG 服务(二),RagFlow 源码全流程深度解析

前面介绍过有道 QAnything 源码解析,通过深入了解工业界的知识库 RAG 服务,得到了不少调优 RAG 服务的新想法。因此本次趁热打铁,额外花费一点时间,深入研究了另一个火热的开源 RAG 服务RagFlow的完整实现流程,希望同样有所收获。首先依旧可以先从框架图入手,与常规的 RAG 架构进行一些比较可以看到右侧知识库被明显放大,同时最右侧详细介绍了文件解析的各种手段,比如OCR等,这些在常规的 RAG 中可能会作为一个不起眼的。

易迟的专栏 2万+

Rockchip平台Android相机HAL3开发实战:从配置到调试全流程解析

本文深入解析了Rockchip平台Android相机HAL3的开发全流程。从理解AAL与PSL核心架构、解析关键配置文件(如camera3_profiles.xml和Tuning文件),到搭建编译环境、进行增量部署,并提供了系统日志分析、V4L2调试等高级问题排查技巧,为开发者提供了一套从配置到调试的实战指南。

docker7nomad的博客 844

Delphi 编写调用WebService接口的小程序

Delphi 编写调用WebService接口的小程序 最近由于项目需要在编写一个webservice的客户端,网上找来了不少资料,都说可以通过delphi自带的向导来生成调用接口的文件。 如对天气预报的webservice调用http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl ,查看各地的天气预报 1、打开delphi开发软件到 File--> New--> Application 新建一个工程,在窗体上放置两个

全欣 的专栏 2317

微信小游戏审核避坑指南:如何一次性通过微信审核(附最新审核要求)

本文详细解析微信小游戏审核全流程,提供从开发到上线的关键策略,帮助开发者一次性通过审核。涵盖合规性自查、材料优化、开发环境配置、版本管理、审核材料填写技巧等核心内容,并附最新审核要求和常见驳回问题解决方案,显著提升审核通过率。

weixin_28454475的博客 1411

一步一步用Delphi6实现Web Service

      本文介绍的是如何用Delphi6开发Web Service程序,并把服务程序放在IIS Web服务器上提供给各种客户程序调用。一编写服务程序第一步:File----->New----->Other------>WebServices----->Soap Server Application选择ISAPI/NSAPI Dynamic Link Library然后确定。生成一个

coala的专栏 1526

从零构建:用Arduino和MCP2515模块搭建你的第一个CAN Bus网络

本文详细介绍了如何使用Arduino和MCP2515模块从零搭建CAN Bus网络,实现温湿度数据的传输与显示。涵盖硬件连接、软件配置、发送端与接收端代码实现,以及系统调试和进阶应用,帮助初学者快速掌握CAN总线通信技术。

d6e7f8的博客 831

安装Tailscale

如果返回 /usr/bin/tailscale 或类似路径,说明已安装但 sudo 可能找不到它。如果 which tailscale 没有输出,说明安装失败,重新执行安装步骤。Tailscale 的后台服务 tailscaled 必须运行。检查 tailscaled 服务是否运行。检查 tailscale 命令是否存在。

FairLikeSnow的博客 1471

Delphi 调用webservice简单例子

1、打开delphi,File-&gt;New-&gt;Other-&gt;选webservice-&gt;WSDL importer 如下所示2、点【ok】,弹出输入WSDL 的URL地址框,输入WSDL地址,然后【Next】3、点【Next】之后,Delphi将自动生成ServerClass.pas单元4、接下来我们测试这个WS5、得出以下结果...

mpqz1065ok的专栏 9520

TSMaster二次开发实战:如何用Python搞定CAN/CANFD事件回调(附完整代码)

本文详细介绍了如何利用Python进行TSMaster二次开发,实现CAN/CANFD事件回调功能。通过实战代码演示,讲解了预发送与后处理回调的核心区别、注册流程、资源管理及性能优化技巧,帮助工程师高效构建自动化测试与数据监控应用。

star的博客 668

C# Webservice与Delphi交互详解

大家都知道C# Webservice技术的出现将各种开发技术和语言完全的融合了,下面就这种融合在C#和delphi之间的交互做一次全面的体现,前者是目前最好的开发平台,后者依然是小型c/s系统的最佳选择. 1.使用C#创建一个Webservice服务。     使用vs2005的模板创建C# Webservice非常容易。原文件如下: [WebService(Namespace = 

420

C#联合Halcon机器视觉框架源码—升级版

相较于之前的NxtVision,本软件代码架构更加合理,且新增。对源码有需求的,订阅本专栏后,私信我领取。、原来的vb脚本改为。

Z's Palace 1415

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Delphi调用WebService

至于怎么把webservice发布到服务器上,我就省略不说了。有需要的可以在评论区留言发布到服务器上之后我们得到这样一个页面; 这个webservice下有两个函数Add和HelloWorld。 我们以HelloWorld来示范。第一步,File->New->Applicaiton 在这个页面简单的放一个按钮 如图: 第二部,File->New->Other 选择webservice标签

shenbin6830的博客 5821

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Session原理分析

Session模型简介Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符

Delphiandliu的专栏 8764

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

用Delphi编写Web Service(实例)

1. File->New->Other,在打开的对话框中,选择Web Services/SOAP Server Application。2. 在这里选择ISAPI DLL。3. 问咱Create Interface for SOAP module,当然是yes啦,然后输入个名称XXX,等下会生成XXXIntf.pas和XXXImple.pas这两个文件,分别对应接口和类的实现。在这里,对外

Sono simpatico... 1万+
上一篇: 使用 OpenSSL 为自己做证书实现自己的 HTTPS 服务器
下一篇: 使用 Helper class 访问一个类的私有变量
pcplayer
博客等级 码龄26年 633粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值