WCF:在IIS之外托管服务会导致IIS萎缩

3

看起来微软允许在IIS之外托管WCF服务是自己给自己挖了一个坑。从我的角度来看,IIS对于服务而言是相对简单但却冗余的层。WCF的引入极大地简化了服务托管,使得IIS变得不再重要。那么你认为呢?我有什么遗漏吗?为什么我要使用IIS来托管WCF服务呢?因为我没有看到理由。


1
IIS是微软手头唯一的通用主机 - 但我认识的大多数WCF专家(例如Juval Lowy)都会争辩说永远不要使用IIS来托管生产级别的WCF服务。我总是将我的生产WCF服务放入自托管的NT服务中。 - marc_s
1
@marc_s:如果可以的话,我会给你加10分。 - Schultz9999
@marc_s:无法编辑我的上一篇帖子。只是想提一下,NT服务是一种在崩溃情况下自动启动和重新启动的好方法。它完全解决了Pauli的公告2。 - Schultz9999
1
内存分析或请求日志记录方面,WCF提供了哪些开箱即用的功能?使用IIS,您可以免费获得一整套工具来分析应用程序健康状况以及每个请求/响应。 - Pauli Østerø
@Pauli:如果使用的是除HTTP绑定之外的绑定,您所指的请求日志记录是什么? http://msdn.microsoft.com/en-us/library/ms730064.aspx 提供了有关日志记录选项的信息。 - Schultz9999
显示剩余2条评论
3个回答

6
在IIS内托管具有其优点,如果您想使用基础的asp.net框架进行身份验证和授权。请记住,这需要将AspNetCompatibilityRequirementsMode属性设置为Required。这还使您可以访问HttpContext.Current,以轻松检索后置值、cookie等。

http://msdn.microsoft.com/en-us/library/ms734710.aspx

  • 托管在IIS中的WCF服务与ASP.NET应用程序和ASMX一样进行部署和管理。
  • IIS提供进程激活、健康管理和回收功能,以提高托管应用程序的可靠性。访问Health Monitoring Features可以监视您的Web应用程序的状态。
  • 与ASP.NET一样,托管在ASP.NET中的WCF服务可以利用ASP.NET共享托管模型,多个应用程序驻留在一个共同的工作进程中,从而提高服务器密度和可扩展性。
  • 托管在IIS中的WCF服务使用与ASP.NET 2.0相同的动态编译模型,简化了托管服务的开发和部署。

2
+1 - 和进程激活、健康管理、回收、共享托管(多个应用程序在公共工作进程中)等内容。请参阅 http://msdn.microsoft.com/en-us/library/ms734710.aspx。 - Joe
1
嗯...你确定吗?根据这个链接http://msdn.microsoft.com/en-us/library/aa738737.aspx,WCF提供了相同的功能(请参见安全部分):“...为ASP.NET Web服务提供的设施也适用于在ASP.NET兼容模式下运行的WCF服务”。 - Schultz9999
@Pauli:WAS,即Windows Activation Service,是您在公告2中提到的进程激活地址:http://msdn.microsoft.com/en-us/library/ms733109.aspx。实际上,WAS似乎是IIS功能的超集,但更加轻量级:http://www.code-magazine.com/article.aspx?quickid=0701041。 - Schultz9999
1
在IIS中托管WCF服务是一个丑陋的解决方案,而且有很多缺点:依赖于AppPools和回收,这些无法以任何合理的方式进行控制;IIS规定了服务器地址+端口和服务URL的部分内容;不必要的*.svc文件会破坏您的服务URL...... - marc_s
@Pauli:WAS与IIS无关。根据http://en.wikipedia.org/wiki/Windows_Activation_Services,“作为一个独立的Windows组件,WAS与IIS托管环境完全分离,并提供协议无关的激活机制”。 - Schultz9999
显示剩余11条评论

3

我有些同意。尽管Pauli在他的帖子中提到了许多优点(对此表示+1),但我认为选择IIS作为WCF的原因有几个:

  • Net*绑定:IIS不支持非HTTP/S绑定,例如(非常有用的)NetTcpBindingNetNamedPipeBindingNetMsmqBinding。您可以使用Windows Process Activation,但那就不是真正的IIS了。此外,旧版本的IIS没有WAS,因此根本不支持非HTTP/S绑定。
  • 配置和部署: IIS(和WAS)存在大量的配置开销,这可能无法证明在您的服务部署方案中得到证明。
  • 依赖性和测试: 使用IIS(或WAS)会在这些组件上创建额外的依赖性。IIS以仅支持每个Windows版本的特定版本而闻名,并且使用许多不同版本测试您的服务可能很容易变得繁琐。可以在计算机上部署确切版本的.NET Framework,并且自托管可确保最少数量的变量。
  • 易用性: 上述配置、部署和依赖问题可能证明是一个主要且有时不必要的学习曲线,特别是对于非HTTP/S服务。
  • 灵活性: 如果您已经将.NET应用程序作为Windows服务运行,则可以在其中托管WCF,而无需额外的管理工作-如果有人已经维护您的服务,则WCF也会随之启动。

我回答中的加分点是,我认为选择IIS的主要原因是如果您需要Asp.Net兼容模式,这意味着只有HTTP绑定。 - Pauli Østerø
关于依赖性,我不同意... IIS并不以与任何特定的.Net版本绑定而闻名,只要配置为.Net 4,运行经过测试的相同WCF服务在IIS 6、7或7.5上应该没有问题。 - Pauli Østerø
@Pauli:我不是一个ASP.NET(或IIS)专家,所以我对IIS、WCF和ASP.NET三位一体的优缺点一无所知。这就是为什么你的回答提供了有关这些事情的有用见解,而我无法提供。编辑:关于依赖性,上面整个层次可能会有所不同。即使使用相同的.NET版本,也可能出现并发问题和其他环境相关问题。 - Allon Guralnek

1

就目前而言,我不同意在Windows Server 2008/2008R2中使用IIS 7/7.5之外的主机。是的,在IIS 6中,您有充分的理由在IIS之外进行主机托管(例如,如果您正在使用net.tcp绑定)。但是,与自主托管相比,IIS提供更好的身份验证、负载平衡、容错、监控等功能。例如,我从未成功地将带有客户端证书的SSL与自托管服务正常工作。或者尝试基于IP地址进行限制等。以.svc结尾的服务URL也不再有效,因为WCF 4.0已经更新了这一点。另一个优点是,大多数系统管理员都熟悉IIS管理器,并且可以轻松地通过GUI更改web.config中的所有设置以进行操作支持。部署变得更加容易,您可以从暂存环境克隆IIS站点到生产环境。通过IIS的Appfabric扩展,您可以获得非常详细的监视和仪表板,用于监视您的服务调用(例如,每秒钟的调用次数、失败的调用次数、平均调用持续时间等),以及工作流托管服务的服务调用持久性等。您还可以从一个中央控制台监视整个公司的所有IIS站点,我认为甚至还有一个将appfabric与SCOM集成的功能。

简而言之,我认为对于企业级托管,应选择IIS和Appfabric作为WCF服务的托管。

你将自己限制在了两个选项上 - IIS 和自托管。对于 HTTP 服务来说,当然,IIS 是这两个中的胜者。然而,使用 HTTP 进行服务间通信并不好,因为二进制绑定更快。因此,如果你还考虑到 Windows Service 和 Windows Activation Services,那么 IIS 就不再是一个好主意了。当然,它们两个都比自托管提供了更多的功能。 - Schultz9999
我除了安全方案外,并没有提到HTTP。IIS 7及以上版本可以与WAS一起使用,实现非HTTP绑定,并获得所有Appfabric的优势。我们中的一些人还致力于创建核心企业服务,这些服务被Java客户端和其他第三方所使用,需要最大程度的互通性,因此不能使用二进制传输。 - softveda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接