我遇到了一个有趣的问题,我从来没有遇到XP或IIS 6。
基本上,我无法得到一个原生的Delphi(WebBroker)Web服务服务器,以使用Windows 7 64位本地Web服务客户端。
这是最基本的细分。 如果我在Delphi 2010中创build一个新的Web服务应用程序(或任何版本,返回到Delphi 7),并使用IE 8访问它,我可以看到WSDLHTMLPublish组件创build的HTML,但我永远无法访问SOAP。 以同样的方式,WSDL导入器也不能访问SOAP。 (我将IIS 7configuration为使用32位应用程序池,并且已经创build了一个可用于处理程序映射的脚本映射。简而言之,32位ISAPI Web服务正在运行)。
例如,我有一个简单的名为TestService的Web服务服务器(使用创build新的Web服务服务器时生成的默认示例界面创build)。
我将它安装在一个名为scripts的虚拟目录中。
如果我在地址栏中input服务的URL,IIS 7将显示相应的页面。
如果我将鼠标放在ITestService的WSDL链接上,则会在状态栏中看到pathinfo部分。 但是,当我点击这个链接时,地址栏会显示带有pathinfo的完整URL,但是我只能看到来自服务的HTML(没有pathinfo的URL)。 似乎没有办法去到SOAP定义。 IIS 7似乎忽略了脚本名称后面的所有内容(忽略了pathinfo)。
IIS7剥离pathinfo的额外证据是,如果我将鼠标hover在ITestService链接上,状态栏将显示带有查询string(no pathinfo)的服务URL。 点击该链接可以将我带到另一个HTML页面,即与服务和查询string关联的页面。 但是,任何包含跟在脚本名称后面的pathinfo的链接都只需将我带到基本URL(无path信息)。
我已经在Delphi 7,Delphi 2010和Delphi XE中testing了这个结果(全部在Windows 7 Ultimate 64位上)。
我猜测IIS7正在剥离pathinfo,因为即使是WSDL导入器也不能到达SOAP定义。 与Chrome获得相同的结果。 换句话说,它似乎不是一个浏览器问题。
这是一个IIS7configuration问题?
问题是我已经在ISAPI DLL的处理映射中创build了特定的脚本映射。 这导致IIS将所有请求redirect到特定的dll,这就是为什么包含infopath部分的任何请求被忽略。 信息被删除了。
我真正需要做的只是启用ISAPI-dll模块映射处理程序映射的执行function权限。 一旦允许未指定的ISAPI模块(或CGI模块,如果这是您创build的Web服务器扩展types),则此模块映射可用于虚拟目录。
为了解决我的问题,我需要
删除我已经搞砸了的处理映射的目录。
由于我已经允许未指定的ISAPI模块(从服务器的IIS部分的ISAPI和CGI限制小程序中select编辑function设置),我需要为相应的网站添加一个新的虚拟目录(这里是我重新创build我在前面的步骤1中删除的目录。
从虚拟目录的处理映射小程序中,可能会禁用ISAPI-dll处理映射。 select它并select右侧的编辑function权限选项。 启用执行checkbox。
不要编辑ISAPI-DLL处理映射并添加一个可执行文件。 尽pipe这个对话框说可执行文件是可选的,但是一旦你添加了一个,就结束了。 你永远不能删除它(我永远不能删除它)。 在我的一个VM安装中,我在这个对话框上有一个Executable条目。 为了摆脱它,我不得不卸载IIS 7,然后重新安装它。 (也许这不是必须的,但我不知道如何删除并重新安装模块映射,而不input可执行文件)。
此外,如果您的ISAPI DLL是一个32位DLL,并且您正在使用64位操作系统,则需要为关联的应用程序池启用32位应用程序。
我希望我的痛苦帮助了某人。
我知道这个问题有点老,但这个答案可能会帮助有同样问题的人。
在IISpipe理器中添加脚本映射时,它将在web.config中像下面这样创build处理程序:
<?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”添加到处理程序。 IISpipe理器没有这个选项,你必须手动编辑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>
这样你可以selectISAPI扩展的请求path(在这个例子中是: http:// HOSTNAME / MyISAPI / myisapi ),否则没有这个改变,你将需要调用带有DLL名称的http: /HOSTNAME/MyISAPI/myisapi_extension.dll )