如何使ClientAccessPolicy.xml的WebHttpBehavior停止窃取/劫持IIS的根目录?

时间:2012-10-18 17:10:28

标签: wcf silverlight webhttpbinding clientaccesspolicy.xml

我正在使用具有net.tcp WCF通信的Silverlight应用程序。我想在ServiceHost中自托管ClientAccessPolicy.xml,并且策略文件必须位于根,端口80,根据Silverlight net.tcp要求(TCP端口4502-4534等)。我的问题是,当我的ServiceHost运行时,它会从IIS窃取端口80根,并且我的网页都不起作用。

创建策略端点的代码如下所示:

host.AddServiceEndpoint(typeof(IPolicyGetter), new WebHttpBinding(), "http://localhost/").Behaviors.Add(new WebHttpBehavior());

当ServiceHost运行时,我可以看到我的http://127.0.0.1/ClientAccessPolicy.xml,但是端口80上的所有网站都停止工作 - 我看到端点生成的标准WCF“端点未找到”网页。当我关闭ServiceHost时,我可以看到我的网站,但ClientAccessPolicy.xml已经消失。

我尝试使用端点URI的完整路径:

policyUri.Scheme = "http";
policyUri.Port = 80;
policyUri.Query = "ClientAccessPolicy.xml";
host.AddServiceEndpoint(typeof(IPolicyGetter), new WebHttpBinding(), policyUri.ToString()).Behaviors.Add(new WebHttpBehavior());

但这引发了一个参数异常。将策略移动到子目录或其他端口将不起作用,因为Silverlight仅查看根网站目录上的端口80.

显然,我可以将ClientAccessPolicy.xml复制到Web根目录并禁用策略端点。有没有办法按下端点,以便它只劫持对ClientAccessPolicy.xml的调用,但不会窃取整个IIS端口80?

1 个答案:

答案 0 :(得分:0)

不,您不能在同一个TCP / IP端口上侦听两个进程。如果您的ServiceHost正在侦听端口80,那么它将是响应该端口上的连接的唯一进程。

话虽如此,您可以让“主”进程侦听端口80并将连接重定向到“子”进程,但这超出了ServiceHost的范围和意图。