Delphi Datasnap ISAPI 模块上的 CORS 问题

2024-04-07

我们在 AngularJS 客户端访问 Datasnap REST (Delphi 10.1 Berlin) 服务器时遇到问题。我无法激活授权,因为 Angular 无法在 Pragma 标头中发送 dssession,这似乎是 CORS 的问题,因为浏览器是更改该标头的浏览器(使用 --disable-web-security 平面所有内容启动 Chrome运行良好)。

即使在同一台计算机上运行 Angular 和 Datasnap 进行测试(Angular 位于 localhost:8080,Datasnap 位于 localhost:8081),浏览器也会将调用检测为跨源调用,并且当 Angular 尝试发送 dssession 时,它不会到达 Datasnap 。注意:我允许使用以下代码进行跨域调用:http://delphi.org/2015/04/cors-on-datasnap-rest-server/ http://delphi.org/2015/04/cors-on-datasnap-rest-server/

将服务器作为独立应用程序运行,我可以在 WebModuleBeforeDispatch 事件中看到,TWebRequest 获取值为“Pragma”的 Access-Control-Request-Headers,而不是预期的 Pragma 标头,因此看起来浏览器正在发出 CORS 选项请求,但 Datasnap 不响应它(它引发 TDSServiceException 并显示“命令已关闭或未分配”消息)。

我已经为 StandAlone 应用程序解决了这个问题,通过 URL 传递 dssession (它不会干扰参数的正常传递,因为我只使用来自 AngularJS 的 POST 调用),然后拦截 WebModuleBeforeDispatch 事件上的请求并手动添加带有从调用 URL 检索到的 dssession 的 Pragma 标头。

procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; 
                                              Response: TWebResponse; var Handled: Boolean);
var Token: string;
begin
  Response.SetCustomHeader('Access-Control-Allow-Origin','*');     // Allow CORS calls

  Token := TIdHTTPAppRequest(Request).Query;         // Set session on Pragma from the URL
  if Copy(Token, 1, 10) = 'dssession=' then begin
    TIdHTTPAppRequest(Request).GetRequestInfo.RawHeaders.AddValue('Pragma', Token);
  end;

  if FServerFunctionInvokerAction <> nil then
    FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker;
end;

它在独立应用程序上运行良好,但是当我将代码重新编译为 ISAPI 模块以将其部署到最终生产环境时,它不会在请求上添加 dssession Pragma 标头,可能是因为它没有传递 dssession通过 URL,但我无法确定原因,因为我无法让我的 Delphi 调试该 ISAPI 模块。

我遵循这个教程:http://edn.embarcadero.com/article/40873 http://edn.embarcadero.com/article/40873我可以正确设置运行我的 ISAPI 模块,但是当我将 w3wp.exe 进程附加到我的 Delphi 调试器时,它不会停止到任何断点(它们显示为禁用,就像代码是用 Release Build 编译的一样)调试版本),事实上,w3wp.exe 进程似乎被冻结,并且在我将其与 Delphi 调试器分离之前不会参与任何调用。

因此,我将不胜感激任何能够调试该模块的建议,更重要的是,当您的浏览器将它们检测为跨源调用时,将 dssession 传递给 ISAPI 模块。

非常感谢。


我终于找到了一个巧妙的解决方案来设置 Datasnap 来回答 CORS 请求,因为它应该回答它们。

当您的 Datasnap 在 WebModule 上收到 COR 请求时。在调度事件之前,您只需回答允许发送自定义标头 (Pragma),将 Handled 设置为 True 很重要,因此 Datasnap 不会尝试管理该 OPTION 请求调用方法的正常请求。

procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Response.SetCustomHeader('Access-Control-Allow-Origin','*');        

  if Trim(Request.GetFieldByName('Access-Control-Request-Headers')) <> '' then 
  begin 
    Response.SetCustomHeader('Access-Control-Allow-Headers', Request.GetFieldByName('Access-Control-Request-Headers'));        
    Handled := True;
  end;

  if FServerFunctionInvokerAction <> nil then
    FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi Datasnap ISAPI 模块上的 CORS 问题 的相关文章

随机推荐

  • 根据 GPS 坐标计算平均速度的最佳实践

    我这里有一个可以给我 GPS 坐标的设备 我可以定义的时间间隔 我想用它来计算驾驶或驾车旅行时的平均速度 实际上 我使用了正交公式来计算两点之间的距离 然后将其除以给定的时间间隔 通过我遵循的实施这个词 http de wikipedia
  • 在Webpack中通过代码将nonce设置为样式标签

    因为我想启用内容安全策略 CSP noncestyle 属性 所以我需要设置nonce通过代码动态调整样式 网页包设置 devServer contentBase dist watchContentBase true headers Con
  • 为什么我的 mongodb 集合会自动删除?

    我在三个 EC2 实例中有一个 MongoDB 客户端 并且创建了一个副本集 上次我遇到了空间问题约束 https askubuntu com questions 864631 amazon ec2 instance ubuntu 16 0
  • 核心数据实体中布尔属性的类型是什么?

    我以编程方式使用核心数据 即不使用 xcdatamodel数据模型文件 其方式与 Apple 中描述的方式大致相同核心数据实用程序教程 http developer apple com documentation Cocoa Concept
  • 静态数据成员模板专业化的实例化点在哪里

    考虑下面的代码 include
  • Java-如何通过单击按钮添加更多文本字段?

    我创建了一个frame在Java中有一些textfields and buttons在里面 假设用户想要更多文本字段 例如添加更多数据 我想放一个button当用户点击时the button 然后一个新的textfield应该出现 然后用户
  • 如何使新的“使用 Google 登录”按钮在页面重新加载时保留用户登录状态?

    谷歌正在弃用旧的登录按钮 https developers google com identity sign in web sign in有利于新的那一个 https developers google com identity gsi w
  • 将字符串修剪到一定的字数

    我的模板中有一个描述 p data description p 我想将此描述修剪为特定字数 例如前 20 个字 我见过很多过滤器 但它们都会修剪某些字符 在大多数情况下 这会导致最后一个单词中断 您需要使用空格将描述字符串拆分为单词 然后对
  • 有人可以向我解释一下这个“StaleDataException”吗

    有人可以向我解释一下吗StaleDataException 07 11 19 58 23 298 E AndroidRuntime 1044 Uncaught handler thread main exiting due to uncau
  • 如何在 JavaScript 和 Python 中对 unicode 字符串进行 Base64 编码?

    我需要一种加密算法 将文本加密到文本 输入文本可以是 unicode 输出应该是 a z A Z 0 9 最多 64 个字符 并且可以再次解密为unicode 它应该用 javascript 和 python 实现 如果已经有一些图书馆可以
  • 无法打开意图android的pdf文件

    我彻底检查了pdf文件是 在 storage emulated 0 Download Abcd pdf 但无法有意打开它 我在各种视图中打开它 其中一些会导致错误 无法打开文件 微软的话说道 check file in the device
  • 在tkinter中生成点击事件

    我正在尝试对我的 tkinter GUI 进行单元测试 因此我尝试从单独的线程生成点击事件 下面是测试 Tkinter Button 的示例 import unittest threading from Tkinter import cla
  • 我的枚举可以有友好的名称吗? [复制]

    这个问题在这里已经有答案了 我有以下内容enum public enum myEnum ThisNameWorks This Name doesn t work Neither does this 是不是不可能有enum带有 友好名称 你可
  • PHP如何获取基域/url?

    function url if isset SERVER HTTPS protocol SERVER HTTPS SERVER HTTPS off https http else protocol http return protocol
  • 删除文本文件 php 中的一行[重复]

    这个问题在这里已经有答案了 所以我的想法是使用正则表达式在文本文件中查找特定行 然后用空白替换该行 实质上将其删除 但是 我正在努力在文本文件中重写带有空白的行 elseif inquiry delete file fopen databa
  • 使用 getopt 时“for i”没有“in [sequence]”结尾

    我找到了在 shell 中使用 getopt 命令的示例脚本 bin bash args getopt ab set args for i do case i in a shift echo it was a b shift echo it
  • RNC 中交织

    我有三个具有不同属性值的 p 的源代码 我尝试对元素进行任意顺序以及一个强制元素 p class paragraph1 即任意数量的第 1 段 第 2 段和第 3 段 按任意顺序 但必须至少有一个段落 1 下面我尝试了 RNC 中的交错选项
  • PDF Tm 运算符

    我试图突出显示 PDF 文档中的文本 但我发现了一个带有以下操作数的 Tm 运算符 0 7 98 7 98 0 90 8898 715 4183 Tm Tm 运算符应该仅在其操作数上替换文本矩阵和文本行矩阵 根据Pdf Reference
  • 如何使用.NET设置文件夹权限?

    是否可以使用小型 NET 页面来设置其所在服务器上某些文件夹的文件夹权限 可用于此目的的代码或对象是什么 我使用的是 Windows Server 2003 基本上我想使用 GET 或 POST 访问页面并运行它并检查和 或更新文件夹的权限
  • Delphi Datasnap ISAPI 模块上的 CORS 问题

    我们在 AngularJS 客户端访问 Datasnap REST Delphi 10 1 Berlin 服务器时遇到问题 我无法激活授权 因为 Angular 无法在 Pragma 标头中发送 dssession 这似乎是 CORS 的问