【问题标题】:Using TidHTTPServer to serve GET request the safe way使用 TidHTTPServer 以安全的方式服务 GET 请求
【发布时间】:2013-07-06 16:55:10
【问题描述】:

我有一个包含许多服务的类,这些服务基本上调用数据库连接(DBISAM 或通过 ZEOS)。

我正在让这个类在 web 服务中可用,比如使用 TidHTTPServer。我正在使用它的 OnCommandGet 事件并使用 ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo 发出请求和结果。

我创建了一个 TObjectList 来保存与此服务类相关的每个客户端的实例。每次调用完成时都会创建和释放与数据库的连接,希望不会出现线程问题。

我想知道这是否是正确的方法。我没有使用来自 TidHTTPServer 的会话。在每个服务请求中,我都会在 TObjectList 上找到存储与该连接相关的信息的对象。

我查看了问题,但没有获得所需的所有信息。

但是我不确定安全性,特别是当许多电话可以同时发生时。我一直经常使用它,每次最多 1 个电话,因为很难同时测试多个连接。

我想知道这是否是正确的方法,或者如果不是,我如何实现一个“桥”来安全地调用我的类(我在这个类上创建了一个 QueryActivity,模仿 COM 查询样式)传递请求和返回参数。

德尔福 XE2 - Indy 10.5.8

【问题讨论】:

  • 这与VCL无关
  • 将所有内容封装在一个线程中
  • @JerryDodge 所有 TIdHttpServer 请求都在单独的线程中。无需将它们分开到另一个线程
  • @SirRufo 当然是的,但我的意思是所有业务逻辑和服务器中所做的处理 - 以及数据库连接,一切
  • @SirRufo 不知道这有什么关系,我说的只是将所有内容封装在自己的主线程中的基本概念,以便可以在 VCL 表单(测试)之间重复使用应用程序和一个 Windows 服务应用程序,也许还有一个 ISAPI 服务器。

标签: web-services delphi indy


【解决方案1】:

Indy TCP 服务器类(如 tTIdHTTPServer)可以选择分配特定于应用程序的上下文类。此类包含有关客户端的特定于连接的信息,并且可以使用自定义属性进行扩展以携带您的应用程序特定信息。为此,从 TIdServerContext 创建一个子类,并将该类分配给服务器的 ContextClass。

如果请求之间的连接保持活动状态(建议这样做以节省资源),则此上下文将在其生命周期内保留特定于应用程序的客户端信息。

Indy 还允许迭代所有已连接连接上下文的列表,例如支持广播消息或收集信息。

Stackoverflow 上的示例:

How to track number of clients with Indy TIdTCPServer

Indy 10 TCP server

How do I send a command to a single client instead of all of them?

【讨论】:

    【解决方案2】:

    处理线程并因此注意线程安全,您必须始终关注目标。

    数据库

    多用户数据库是线程安全的,单用户不是

    数据库访问组件

    有些是线程安全的,有些不是。如果您不知道,请将它们视为非线程安全的


    在你的情况下(希望你有一个多用户数据库)每个线程使用一个连接/查询实例是安全的。

    如果您想加快应用程序的速度,请使用 ObjectPool 连接和查询实例。

    出于测试目的,您可以构建一个小型客户端,在循环中执行大量请求并运行该客户端的多个实例。

    【讨论】:

    • 我使用的两个数据库访问组件都是线程安全的,并且根据我在他们的文档中找到的规则使用以确保它。
    • +1 不知道为什么会投反对票,但这很简单,因为答案可能是一个如此广泛的问题。
    • 用于HTTP服务器测试,模拟很多客户端,可以使用Apache Bench和Apache JMeter,还可以收集统计数据,绘制图表(JMeter),使用方便
    猜你喜欢
    • 1970-01-01
    • 2019-11-19
    • 2019-10-09
    • 2012-01-24
    • 1970-01-01
    • 2014-01-20
    • 2015-07-09
    • 2016-01-25
    • 2019-04-20
    相关资源
    最近更新 更多