Назад | Перейти на главную страницу

Есть ли в IIS 7 параметр, который может удалять часть pathinfo моего HTTP-запроса?

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

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

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

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

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

Если я введу URL-адрес службы в адресной строке, IIS 7 отобразит соответствующую страницу.

Если я наведу указатель мыши на ссылку WSDL для ITestService, я увижу часть pathinfo в строке состояния. Однако, когда я нажимаю эту ссылку, в адресной строке отображается полный URL-адрес с информацией о пути, но я вижу только HTML из службы (URL без информации о пути). Кажется, нет способа добраться до определения SOAP. Кажется, что IIS 7 игнорирует все, что идет после имени сценария (игнорирует информацию о пути).

Дополнительным свидетельством того, что IIS7 удаляет информацию о пути, является то, что если я наведу курсор мыши на ссылку ITestService, в строке состояния отобразится URL-адрес службы со строкой запроса (без информации о пути). Щелчок по этой ссылке переводит меня на другую HTML-страницу, связанную со строкой запроса и службы. Однако любая ссылка, которая включает информацию о пути после имени скрипта, просто ведет меня к базовому URL (без информации о пути).

Я тестировал это в Delphi 7, Delphi 2010 и Delphi XE с теми же результатами (все в Windows 7 Ultimate 64-bit.

Я предполагаю, что IIS7 удаляет pathinfo, поскольку даже WSDL Importer не может добраться до определения SOAP. Я получаю те же результаты с Chrome. Другими словами, это не проблема браузера.

Это проблема конфигурации IIS7?

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

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

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

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

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

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

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

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

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

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

Когда вы добавляете карту сценариев в диспетчере 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)