Приложения Delphi для веб-служб не работают. IIS 7, кажется, удаляет pathinfo - PullRequest
3 голосов
/ 28 сентября 2010

Я столкнулся с интересной проблемой, с которой я никогда не сталкивался в XP или IIS 6.

По сути, я не могу заставить собственный сервер веб-службы Delphi (WebBroker) работать с собственным веб-сервисомклиент в Windows 7 64-битный.

Вот самая основная разбивка.Если я создаю новое приложение веб-службы в Delphi 2010 (или любой другой версии, вплоть до Delphi 7) и обращаюсь к нему с помощью IE 8, я вижу HTML-код, создаваемый компонентом WSDLHTMLPublish, но я никогда не смог добраться до SOAP.Точно так же импортер WSDL также не может получить доступ к SOAP.(У меня IIS 7 настроен на использование 32-разрядного пула приложений, и я создал рабочую карту сценариев для сопоставлений обработчиков. Короче говоря, 32-разрядная веб-служба ISAPI работает).

НапримерУ меня есть простой сервер веб-службы с именем TestService (созданный с использованием примера интерфейса по умолчанию, сгенерированного при создании нового сервера веб-службы).

Я установил его в виртуальный каталог с именем scripts.

Если я введу http://localhost/scripts/TestService.dll/wsdl, IIS 7 отобразит страницу http://localhost/scripts/TestService.dll.

Если я наведу указатель мыши на ссылку WSDL для ITestService, в строке состояния появится http://localhost/scripts/TestService.dll/wsdl/ITestService.Однако, когда я нажимаю эту ссылку, в адресной строке отображается http://localhost/scripts/TestService.dll/wsdl/ITestService,, но я вижу только HTML-код из http://localhost/scripts/TestService.dll. Кажется, нет никакого способа получить определение SOAP.IIS 7, похоже, игнорирует все после имени скрипта (игнорирует информацию о пути).

Дополнительным доказательством того, что IIS7 удаляет информацию о пути, является то, что, если я приостановлю свою мышь над ссылкой ITestService, строка состояния покажет http://localhost/scripts/TestService.dll?intf=ITestService. При щелчке по этой ссылке я перехожу на другую HTML-страницу, связанную с http://localhost/scripts/TestService.dll?intf=ITestService. Однако любая ссылка, содержащая pathinfo после имени скрипта, приводит меня просто к http://localhost/scripts/TestService.dll.

Я проверил это в Delphi 7, Delphi 2010 и Delphi XE с теми же результатами.

Я предполагаю, что IIS7 удаляет информацию о пути, поскольку даже импортер WSDL не может получить определение SOAP.

Попытка создания нового веб-сервиса с использованием опции CGI и получение того же результата.

Есть идеи, что происходит?

Добавлено: Боб Сварт сообщает, что у него естьне было проблем под Windows 7 32-bit.Скачиваем 32-битную ОС и попробуем это (на новой ВМ).

Ответы [ 2 ]

4 голосов
/ 29 сентября 2010

Проблема заключалась в том, что я создал конкретное сопоставление сценариев в Обработка сопоставлений для библиотеки ISAPI.Это заставило IIS перенаправить все запросы к определенной DLL, поэтому любой запрос, содержащий часть пути к информации, был проигнорирован.Информационный путь был удален.

Что мне действительно нужно было сделать, так это просто включить разрешение «Выполнить» функции сопоставления обработчика сопоставления модуля ISAPI-dll.Это сопоставление модулей доступно для виртуального каталога после того, как вы разрешите неуказанные модули ISAPI (или модули CGI, если вы создали такое расширение веб-сервера).

Чтобы исправить мою проблему, мне нужно было

  1. Удалите каталог, чьи отображения обработки я испортил.

  2. Поскольку я уже разрешил неуказанные модули ISAPI (выберите «Изменить параметры настройки» в ISAPIи апплет CGI Restrictions из раздела IIS сервера), затем мне нужно было добавить новый виртуальный каталог для соответствующего веб-сайта (здесь я воссоздал каталог, который я удалил на предыдущем шаге 1.

  3. В апплете «Обработка сопоставлений» для виртуального каталога вы, вероятно, отключили сопоставление обработки ISAPI-dll. Выберите его и выберите параметр «Редактировать разрешения для функции» справа. Установите флажок «Выполнить».

Не редактируйте отображение обработки ISAPI-dll и не добавляйте исполняемый файл.ru хотя в этом диалоговом окне говорится, что исполняемый файл является необязательным, после его добавления все заканчивается.Вы никогда не можете удалить это (я никогда не мог удалить это).На одной из моих установок виртуальной машины у меня была запись Исполняемого файла в этом диалоговом окне.Чтобы избавиться от него, мне пришлось удалить IIS 7, а затем переустановить его.(Возможно, в этом не было необходимости, но я не мог понять, как удалить и переустановить сопоставление модулей, не вводя запись «Исполняемый файл».)

Кроме того, если ваша ISAPI DLL является 32-битной DLL, а выВы работаете в 64-битной операционной системе, вам нужно включить 32-битные приложения для соответствующего пула приложений.

Надеюсь, моя боль кому-то помогла.

3 голосов
/ 08 февраля 2015

Я знаю, что этот вопрос немного устарел, но этот ответ может помочь кому-то с такой же проблемой.

При добавлении карты сценариев в диспетчере IIS он создает обработчик в файле web.config.как это:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers accessPolicy="Read, Execute, Script">
            <add name="MyISAPI" path="myisapi" verb="*" modules="IsapiModule" scriptProcessor="C:\MyISAPI\myisapi_extension.dll" resourceType="Unspecified" requireAccess="Execute" preCondition="bitness32" />
        </handlers>
    </system.webServer>
</configuration>

Что вам нужно сделать, это добавить атрибут allowPathInfo = "true" в обработчик.Диспетчер IIS не имеет этой опции, и вам нужно отредактировать файл web.config вручную:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers accessPolicy="Read, Execute, Script">
            <add name="MyISAPI" path="myisapi" verb="*" modules="IsapiModule" scriptProcessor="C:\MyISAPI\myisapi_extension.dll" resourceType="Unspecified" requireAccess="Execute" preCondition="bitness32" allowPathInfo="true" />
        </handlers>
    </system.webServer>
</configuration>

Таким образом, вы можете выбрать путь запроса расширения ISAPI (в данном примере: http://HOSTNAME/MyISAPI/myisapi), в противном случае без этого изменения вам нужно будет вызвать расширение ISAPI с именем DLL (http://HOSTNAME/MyISAPI/myisapi_extension.dll)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...