我们在 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 模块。
非常感谢。