RAD Server部署至IIS的功能异常与排查方案咨询
RAD Server部署至IIS生产环境的问题排查与解答
问题背景
在同一\Inetpub\RADServer\EMSServer目录下,通过EMSDevServer.exe(管理员账户前台运行)运行RAD Server包一切正常,但部署至IIS(LocalSystem账户后台运行)时出现以下异常:
- Fast-Reports始终返回0字节空白PDF
- WinCrypt的
CryptDecrypt调用出现AV错误
修改RADServer应用池身份为管理员账户后,问题发生变化:Fast-Reports仍返回空白PDF,初始化阶段CryptDecrypt调用正常,但后续端点请求中该调用返回“文件未找到”错误,线程表现不一致。已按Embarcadero博客配置Fast-Reports与IIS,使用32位Delphi 12.1编译包,且已提交支持请求至Embarcadero。
1. IIS下识别缺失依赖的推荐步骤及解决方法
依赖识别
- 使用Process Monitor(ProcMon):过滤进程名
w3wp.exe,监控“文件系统”操作,查找标记为NAME NOT FOUND或ACCESS DENIED的记录,可精准定位被拒绝访问的DLL、配置文件或资源。 - 使用Dependency Walker的Profile模式:直接加载IIS的
w3wp.exe进程并附加你的RAD Server包,动态追踪运行时的依赖加载情况,能捕获静态依赖分析无法发现的动态加载失败(包括子依赖)。
解决方法
- 系统DLL:若缺失的是系统组件(如
ADVAPI32.dll),不要复制到应用目录,需检查IIS应用池账户对该DLL所在系统目录(如C:\Windows\SysWOW64,因是32位编译)的读取权限。 - 第三方DLL(如Fast-Reports相关):将所有依赖DLL复制到
\Inetpub\RADServer\EMSServer目录,或把DLL所在路径加入系统PATH环境变量。 - WinCrypt相关:重点检查CryptAPI依赖的加密服务提供程序(CSP)DLL(如
rsaenh.dll)的访问权限,同时确认IIS账户是否有权限访问相关证书存储。
2. 是否推荐启用TRESTRequest.SynchronizedEvents及适用场景
- 不推荐默认启用,该属性仅用于以下特定场景:
- 事件处理代码直接操作VCL/FMX UI控件,需同步至主线程执行;
- 后台线程的事件回调存在线程安全问题,必须在主线程上下文运行。
- 对于RAD Server后端服务,本身是多线程架构,启用该属性会强制所有事件回调切换到主线程,导致性能下降,甚至引发死锁。当前线程表现不一致的问题,根源更可能是权限或资源访问的线程安全问题,而非事件同步问题。
3. 改用Windows版Apache能否解决问题
- 有可能缓解,但并非根本解决方案:
- Apache的服务账户权限模型与IIS不同,默认配置下可能拥有更多文件系统访问权限,或可更灵活配置运行账户,因此可能规避部分权限问题。
- 若问题根源是代码中的线程安全缺陷、依赖DLL的加载路径逻辑错误,换用Apache仍会遇到类似问题。
- 建议优先排查并解决IIS环境下的权限与依赖问题,再考虑更换Web服务器。若更换,需确保Apache运行账户有权访问RAD Server的所有依赖资源,并正确配置CGI/FastCGI参数适配Delphi编译包。
4. Delphi 12.1部署后EMSServer.ini中[Server.Logging]配置无法生成日志的原因
- 权限与路径检查:确认
[Server.Logging]中Enabled设为True,LogFile指定的路径存在且IIS应用池账户拥有写入权限(默认可能写入系统临时目录或需要高权限的路径)。 - 包引用与编译配置:Delphi 12.1可能调整了RAD Server日志模块的默认包引用,需确认编译时已包含
EMS.Server.Logging相关包。 - 系统日志排查:查看Windows事件查看器的“应用程序日志”,查找RAD Server相关的日志写入失败错误,可快速定位权限不足、路径不存在等具体原因。
内容的提问来源于stack exchange,提问作者Marc Guillot
相关产品推荐
相关产品推荐

