我遇到了一个有趣的问题,在 XP 或 IIS 6 中从未遇到过。
基本上,我无法让本机 Delphi(WebBroker)Web 服务服务器与 Windows 7 64 位中的本机 Web 服务客户端协同工作。
以下是最基本的细分。如果我在 Delphi 2010(或任何版本,回到 Delphi 7)中创建一个新的 Web 服务应用程序,并使用 IE 8 访问它,我可以看到 WSDLHTMLPublish 组件创建的 HTML,但我永远无法访问 SOAP。同样,WSDL 导入器也无法访问 SOAP。(我已将 IIS 7 配置为使用 32 位应用程序池,并且我已创建了工作脚本映射到处理程序映射。简而言之,32 位 ISAPI Web 服务正在运行)。
例如,我有一个名为TestService的简单Web服务服务器(使用创建新的Web服务服务器时生成的默认示例接口创建)。
我将它安装在名为脚本的虚拟目录中。
如果我在地址栏中输入该服务的 URL,IIS 7 就会显示相应的页面。
如果我将鼠标放在 ITestService 的 WSDL 链接上,我会在状态栏中看到 pathinfo 部分。但是,当我单击此链接时,地址栏会显示带有 pathinfo 的完整 URL,但我只看到来自服务的 HTML(没有 pathinfo 的 URL)。似乎没有办法获取 SOAP 定义。IIS 7 似乎忽略了脚本名称后面的所有内容(它忽略了 pathinfo)。
IIS7 正在剥离路径信息的另一个证据是,如果我将鼠标悬停在 ITestService 链接上,状态栏将显示带有查询字符串的服务 URL(无路径信息)。单击该链接会将我带到另一个 HTML 页面,即与服务和查询字符串关联的页面。但是,任何在脚本名称后包含路径信息的链接都会将我带到基本 URL(无路径信息)。
我已经在 Delphi 7、Delphi 2010 和 Delphi XE 中测试过这一点,结果相同(均在 Windows 7 Ultimate 64 位上)。
我猜 IIS7 正在剥离 pathinfo,因为即使 WSDL Importer 也无法获取 SOAP 定义。使用 Chrome 时,我得到了相同的结果。换句话说,这似乎不是浏览器问题。
这是 IIS7 配置问题吗?
答案1
问题在于,我在“处理映射”中为 ISAPI dll 创建了一个特定的脚本映射。这导致 IIS 将所有请求重定向到特定的 dll,这就是为什么任何包含 infopath 部分的请求都会被忽略。infopath 被剥离了。
我真正需要做的只是启用 ISAPI-dll 模块映射处理程序映射的执行功能权限。一旦您允许未指定的 ISAPI 模块(或 CGI 模块,如果您创建的是此类 Web 服务器扩展),此模块映射便可用于虚拟目录。
为了解决我的问题,我需要
删除处理映射被我弄乱的目录。
由于我已经允许未指定的 ISAPI 模块(从服务器的 IIS 部分中的 ISAPI 和 CGI 限制小程序中选择编辑功能设置),因此我需要为相应的网站添加一个新的虚拟目录(在这里我重新创建了在上一步 1 中删除的目录。
从虚拟目录的处理映射小程序中,您可能已禁用 ISAPI-dll 处理映射。选择它并选择右侧的编辑功能权限选项。启用执行复选框。
不要编辑 ISAPI-dll 处理映射并添加可执行文件。即使此对话框显示可执行文件是可选的,但一旦您添加了一个,一切就都结束了。您永远无法删除它(我永远无法删除它)。在我的一个 VM 安装中,此对话框中有一个可执行文件条目。为了摆脱它,我不得不卸载 IIS 7 然后重新安装它。(也许这不是必要的,但我不知道如何在不输入可执行文件条目的情况下删除并重新安装模块映射)。
此外,如果您的 ISAPI DLL 是 32 位 DLL,并且您在 64 位操作系统中工作,则需要为关联的应用程序池启用 32 位应用程序。
我希望我的痛苦能帮助到别人。
答案2
我知道这个问题有点老了,但这个答案可能会对有同样问题的人有所帮助。
当您在 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://主机名/MyISAPI/myisapi),否则,如果没有这个更改,您将需要使用 DLL 的名称调用 ISAPI 扩展(http://主机名/MyISAPI/myisapi_extension.dll)