gpt4 book ai didi

javascript - Delphi 的 Datasnap ISAPI 模块上的 CORS 问题

转载 作者:行者123 更新时间:2023-11-30 15:54:32 24 4
gpt4 key购买 nike

AngularJS 客户端访问的 Datasnap REST(Delphi 10.1 Berlin)服务器出现问题。我无法激活授权,因为 Angular 无法在 Pragma Header 中发送 dssession,这似乎是 CORS 的问题,因为浏览器是更改该 Header 的浏览器(使用 --disable-web-security flat everything 启动 Chrome运行良好)。

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

将服务器作为独立应用程序运行 我可以在 WebModuleBeforeDispatch 事件中看到,TWebRequest 获得了一个值为“Pragma”的 Access-Control-Request-Headers 而不是预期的 Pragma Header,因此看起来浏览器正在发出一个 CORS 选项请求并且 Datasnap 没有回答它(它引发了一个带有“命令关闭或未分配”消息的 TDSServiceException)。

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

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;

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

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

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

非常感谢。

最佳答案

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

当您的 Datasnap 在 WebModule 上收到 COR 请求时。在派发事件之前,您只需回答允许发送自定义 header (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;

关于javascript - Delphi 的 Datasnap ISAPI 模块上的 CORS 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38786004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com