Пользователи, работающие с технологией SOAP в среде Delphi, иногда сталкиваются с проблемой, когда при неправильной аутентификации Windows в запросе SOAP появляется диалоговое окно интернет-обозревателя IE для повторного ввода данных. Это поведение может быть нежелательным, особенно в фоновых процессах или планируемых задачах.
Проблема, описанная пользователем, связана с использованием протокола SOAP для обмена данными между двумя приложениями и веб-сайтом. При неправильном вводе имени пользователя или пароля система запрашивает их повторно через диалоговое окно IE, которое может быть бесконечным и не поддаваться контролю со стороны программы. В фоновых процессах это может привести к критическим ошибкам, так как процесс останавливается на диалоговом окне.
Пользователь предоставил примеры кода, где используется TWSRIO, класс, наследующий THTTPRIO, и функция InternetSetOption для установки базовой аутентификации. Однако, несмотря на корректное выполнение кода, при ошибке аутентификации IE все равно показывает диалоговое окно.
Подход к решению
Попытки изменить поведение THTTPRIO при получении статуса 401 не привели к успеху. Однако, в контексте обсуждения было предложено изменить обработчик ошибок WinInet, что позволило бы избежать появления диалогового окна IE.
Решение
Можно использовать следующую функцию MyWiniNetError, которая перехватывает событие ошибки WinInet и предотвращает появление диалогового окна IE:
function TMyRIO.MyWiniNetError(LastError: DWord; Request: Pointer): DWord;
var
OWEProc: TWinInetErrorEvent;
begin
// Если код ошибки равен нулю, возвращаем значение, соответствующее отмене операции
if LastError = 0 then
begin
Result := ERROR_SUCCESS;
Exit;
end;
if Assigned(HTTPWebNode) then
begin
try
// Сохраняем старый обработчик и устанавливаем его в nil для предотвращения бесконечного цикла
OWEProc := Self.HTTPWebNode.OnWinInetError;
Self.HTTPWebNode.OnWinInetError := nil;
try
// Вызываем оригинальный обработчик
Result := Self.HTTPWebNode.HandleWinInetError(LastError, Request, True);
finally
// Восстанавливаем обработчик
Self.HTTPWebNode.OnWinInetError := OWEProc;
end;
except
on E: Exception do
begin
// В случае ошибки логируем проблему
LogThis(E.Message);
Result := ERROR_SUCCESS;
Exit;
end;
end;
end
else
begin
Result := ERROR_SUCCESS;
Exit;
end;
end;
Важно: Применение данного решения может иметь побочные эффекты, поэтому необходимо тщательно протестировать его в различных условиях использования.
Заключение
Изменение обработчика ошибок WinInet с помощью функции MyWiniNetError позволяет избежать появления диалогового окна IE при неправильной аутентификации. Это решение может быть интегрировано в существующие проекты на Delphi для корректной работы с SOAP-запросами, особенно в фоновых процессах и планируемых задачах.
Пользователь столкнулся с проблемой появления диалогового окна Internet Explorer для ввода учетных данных при неправильной аутентификации в SOAP-запросах в Delphi и ищет способ её устранения, чтобы избежать прерывания фоновых процессо
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS