我正在尝试为 Web 服务提供一个简单的代理应用程序。为此,我有一个 HTTP 处理程序,它将对我网站的任何请求传递到 web.config 中配置的另一个网站。该代理已在本地测试过,运行良好。我已经在 VS 2012 上使用 IIS Express 对其进行了测试,并在运行 Windows Server 2008 R2 和 IIS 7.5 的本地服务器上对其进行了测试。
现在,我花了好几天的时间尝试在我们的部署服务器上安装此应用程序,但毫无成效。每次我尝试访问该应用程序时,它都会忽略我在 web.config 上注册了处理程序的事实,而 StaticFile 处理程序会捕获请求。它似乎忽略了我的处理程序注册。
我已经尝试清除应用程序上的所有处理程序并仅保留我创建的 HttpProxy,但它仍然调用 StaticFile。
有趣的是,我偶然在 IIS 的根节点上成功配置了代理处理程序。从那时起,处理程序就可以在我的应用程序上运行,但它也破坏了服务器上的所有其他应用程序,因为它捕获了所有请求,而这些应用程序没有安装处理程序 DLL。因此,当它被继承时它可以工作,但当我在本地配置它时却不行。
这是我的 web.config 的 webServer 部分:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<add name="ProxyHttpHandler"
path="*"
verb="*"
type="DDProxy.ProxyHttpHandler, DDProxy"
resourceType="Unspecified"
/>
</handlers>
</system.webServer>
基本上我很困惑,因为 IIS 似乎忽略了我专门传递给这个应用程序的配置。有什么想法吗?
编辑:这里有一个小的开发。似乎当我编辑 applicationhost.config 时,配置会传递给应用程序(即使我使用“位置”指向我的应用程序)。但是,当我在 web.config 上传递配置时,我没有得到这样的运气。尝试使用 DirectoryListing。
答案1
如果根网站具有带有定义的 http 处理程序或其他 system.webserver 节点的 web.config,则您下面的应用程序可能会从根应用程序继承其配置。
您可以尝试阻止 http 处理程序位置的根配置继承:
<location path="." inheritInChildApplications="false">
<system.webServer>
...
</system.webServer>
</location>
或者在子配置中使用如下方法:
<system.webServer>
<clear/>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<add name="ProxyHttpHandler"
path="*"
verb="*"
type="DDProxy.ProxyHttpHandler, DDProxy"
resourceType="Unspecified"
/>
</handlers>
</system.webServer>
现在,如果在根配置中的 system.web 节点中定义了任何其他 Httphandler,您仍然可能会遇到问题,因此您可能需要在子配置中清除它:
<system.web>
<httpHandlers>
<clear />
</httpHandlers>
</system.web>