Вопрос, поднятый пользователем, касается проблемы с CORS (Cross-Origin Resource Sharing) в сервере Datasnap REST, созданном с использованием Delphi 10.1 Berlin. Клиентом данного сервиса является AngularJS, который не может отправлять заголовок dssession внутри заголовка Pragma, что связано с ограничениями, наложенными браузером при обработке CORS-запросов. Даже при тестировании на одном устройстве, где клиент AngularJS работает на порту 8080, а сервер Datasnap на порту 8081, браузер определяет запросы как междоменные, и dssession не доходит до сервера.
Пользователь уже нашел решение для запуска сервера как StandAlone приложения, передавая dssession через URL и добавляя его в заголовок Pragma в событии WebModuleBeforeDispatch. Однако, при компиляции кода в виде ISAPI модуля для деплоя в производственной среде, заголовок dssession в Pragma не добавляется, что может быть связано с отсутствием передачи dssession через URL. Отладка ISAPI модуля затруднена, так как при подключении процесса w3wp.exe к отладчику Delphi, он замораживается и не отвечает на вызовы до отключения отладчика.
В подтвержденном ответе пользователь описывает, что для корректной обработки CORS-запросов сервером Datasnap необходимо в событии WebModule.BeforeDispatch отвечать на запросы, разрешая отправку кастомизированных заголовков, и установить Handled в True, чтобы Datasnap не пытался обработать OPTION-запрос как обычный.
Пример кода для обработки CORS-запросов:
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;
Важные замечания:
Убедитесь, что сервер поддерживает обработку предварительных запросов (preflight handling) для CORS.
В некоторых средах, например в Delphi XE2, может потребоваться изменение имени поля Access-Control-Request-Headers на Access_Control_Request_Headers.
Если используется метод OPTIONS, то Handled должен быть установлен в True для обработки предварительных запросов.
Следуя этим рекомендациям, можно настроить сервер Datasnap для корректной работы с CORS-запросами от клиента на AngularJS.
Пользователь сталкивается с проблемой CORS при использовании сервера Datasnap REST на Delphi 10.1 Berlin с клиентом на AngularJS и ищет решение для корректной обработки CORS-запросов в ISAPI модуле.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.