我有一个自托管的 WCF 服务和一个需要在同一台机器上运行的 ASP .Net 网站。我发现,当自托管服务运行时,所有对 IIS 的端口 443 的调用(基于 IP 和主机标头/SSL 绑定)都被路由到 WCF 架构,因此只要自托管网站就会停止工作托管服务正在运行。它有效地抢占了 IIS 完成其工作的能力。
请注意,IIS 在其他端口上仍然可以正常工作,例如端口 80。它只是在端口 443 上过于急切。不完全确定这是服务器问题还是代码/wcf 问题。
经过相当多的研究,我能够确定其中一个服务端点,一个设置为模拟 crossdomain.xml 文件的 REST 端点正在抢占 IIS。否则一切都按预期工作。我放弃了那个端点并使用 IIS 来提供文件。
正如您所怀疑的那样,听起来好像自托管服务正在拦截对端口 443 的调用,然后 IIS 才能获取它们。快速检查您的 IIS 日志应该可以确认这是否是正在发生的事情。
请注意,虽然您可以在端口 80 上运行多个域,但如果我没记错的话,您只能在端口 443 上使用一个域,因此主机标头等内容不适用于 HTTPS 连接。这也可能导致您的问题。
有什么方法可以通过 IIS 托管自托管服务?这可能会解决这个问题并减少您将来的管理负担。
编辑以下评论:如果你不能在 IIS 中托管,假设我是正确的 WCF 服务正在拦截 IIS 的请求,这就是阻止流量通过的原因,那么你可能需要添加一些东西到你的WCF 应用程序或创建(或查找现有示例)基于 HttpListener 的传入流量的独立代理,并使用它来识别哪些服务请求正在寻找并适当地中继它。当然,这种类型的代理服务也可用于屏蔽扩展,因此您可以使用它将任何格式的外部 url 中继到适当的内部服务 url。重要的是代理在网络堆栈中位于 WCF 和 IIS 之前,因此它可以在请求被任何一个接收之前拦截请求。如果您正在编写自己的,那么HttpListener可能是一个很好的起点。