Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибка доступа в 64-битных DLL для SOAP-веб-сервисов в Delphi XE6 и решение с WinHTTP

Delphi , Синтаксис , API реализация

Введение

Разработчики, работающие с Delphi, часто сталкиваются с различными проблемами, особенно при работе с 64-битными проектами. В данной статье мы рассмотрим проблему, связанную с вызовом SOAP-веб-сервисов из 64-битных DLL в среде IIS, и предложим решение, основанное на использовании WinHTTP вместо Wininet.

Проблема

Разработчик столкнулся с ошибкой доступа при выполнении вызовов SOAP-веб-сервисов из 64-битного DLL, которое работает в контексте IIS. Проблема проявлялась в виде исключения EAccessViolation при попытке выполнения запросов к веб-сервису, например, к публичному сервису geoipservice от WebServiceX.

Контекст

В контексте разработки проекта на Delphi XE6 для вызова SOAP-веб-сервисов используется код, который инициализирует COM и выполняет вызов метода GetGeoIP класса GeoIPServiceSoap. При работе в 32-битном режиме все работает корректно, но при переходе на 64-битный режим возникает описанная выше ошибка.

Подтвержденный ответ

Проблема, скорее всего, связана с использованием Wininet в контексте службы, такой как IIS, что не поддерживается Microsoft. В качестве альтернативы рекомендуется использовать WinHTTP, который предназначен для работы в таких условиях.

Альтернативный ответ

Разработчик провел эксперименты, создав консольное приложение и DLL, и пришел к выводу, что проблема связана именно с работой в контексте IIS. Использование внешней DLL для выполнения веб-сервисных вызовов не устраняет проблему, так как при вызове из ISAPI DLL ошибка возникает снова.

Решение

Для решения проблемы рекомендуется заменить использование Wininet на WinHTTP, так как Microsoft указывает, что Wininet не поддерживается для использования в службах. WinHTTP является предпочтительным выбором для служб и приложений, работающих в фоновом режиме.

Пример кода на Object Pascal (Delphi)

uses Winhttp;

function GetCountryNameFromIP(const IPAddress: string): string;
var
  WinHttpRequest: IWinHttpRequest;
  GeoIPResponse: string;
begin
  Result := '';
  WinHttpRequest := CoWinHttpRequest.CreateInstance(nil);
  try
    WinHttpRequest.Open('GET', 'http://www.webservicex.net/geoipservice.asmx?GetGeoIP', False);
    WinHttpRequest.SetRequestHeader('Host', 'www.webservicex.net');
    WinHttpRequest.SetRequestHeader('Content-Type', 'text/xml; charset=utf-8');
    WinHttpRequest.SetRequestHeader('SOAPAction', 'http://www.webservicex.net/GetGeoIP');

    WinHttpRequest.Send('', LastOption);
    if WinHttpRequest.Status <> 200 then
    begin
      // Обработка ошибки
    end
    else
    begin
      GeoIPResponse := WinHttpRequest.ResponseText;
      // Парсинг ответа и извлечение страны
    end;
  finally
    WinHttpRequest := nil;
  end;
end;

Заключение

Использование WinHTTP вместо Wininet может решить проблему доступа в 64-битных DLL для SOAP-веб-сервисов в Delphi XE6 при работе в контексте IIS. Это решение было подтверждено сообществом разработчиков, столкнувшихся с аналогичными проблемами, и может быть применено в аналогичных сценариях для обеспечения корректной работы веб-сервисов.

Создано по материалам из источника по ссылке.

Разработчики в Delphi XE6 столкнулись с проблемой доступа к SOAP-веб-сервисам из 64-битных DLL, работающих в контексте IIS, и нашли решение в использовании WinHTTP вместо Wininet.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: API реализация ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 11:57:17/0.013721942901611/1