所以我正在设计一个WCF服务。我对WCF没有经验,我正在尝试决定它是应该在IIS中托管还是自定义Windows服务..还是其他一些选项?
需要考虑的事项:
我怀疑在IIS中托管它会简化某些事情,但我不确定在这种情况下这是不是一个好主意。
我的选择是什么,它们的优缺点是什么?
答案 0 :(得分:16)
您需要基本上看三个选项:
1)在IIS6中托管(Windows Server 2003/2003 R2):在这种情况下,您只能托管HTTP协议 - 没有别的。这本身就是一个很大的限制,你不能使用,例如netTcp for Intranet场景。
2)在IIS7 / WAS中托管(Vista,Server 2008):这为您提供了更多支持协议的选项,并且托管环境起初看起来像是赢家。
3)自托管:在这种情况下,完全取决于您做主办和运营服务所需的一切。
如果你现在抛出选项#1(如果你只有IIS6可用,我总是使用自托管),那就是IIS7与自托管。
IIS7为您提供“按需激活”,例如您的服务代码始终不在内存中,但会在请求进入后加载并实例化。这可能是一个加分。
另一方面,在IIS7 / WAS中托管会让您无法指定自己的端点 - 您的端点以及服务地址是您的“MyService.svc”文件所在的虚拟目录 - 期间。你不能以任何方式,形状或形式改变它。
自托管可能看起来很多工作 - 但它确实为您提供了最大的灵活性:您可以随意选择协议,您可以按照自己喜欢的方式设置自己的寻址方案,并且总共有控制什么时候完成。如果您需要做一些额外的工作来托管服务,您可以引入自己的自定义ServiceHost,等等。
除非您只是稍微使用WCF,否则我总是会建议并投票支持自托管 - 如果您需要在Windows NT服务中始终运行WCF服务(这是最好的解决方案)生产环境),如果您正在开发/调试,您可以在控制台应用程序中完全托管您的WCF服务,您可以在闲暇时启动和停止。
所以简而言之:最后,如果你真的希望控制正在发生的事情,我总是建议自我托管。
一旦微软发布了新的“都柏林”服务器 - 插件,这个可能会发生变化 - 可能是在.NET 4推出后的某个时候,可能是在2010年初 - 但现在还为时尚早。
希望这有帮助。
马克
答案 1 :(得分:6)
我更喜欢自己托管的服务(Windows服务)。有了这个说,有正当理由可以采取任何一种方式。
有一些valuable articles in MSDN regarding different WCF hosting strategies。
以下是good summary of why you might choose to use IIS作为您的服务主机。
答案 2 :(得分:3)
我想说,如果没有IIS7和WAS,除了使用IIS的基于HTTP的端点之外,你不能托管任何东西。因此,您很可能希望自我主持灵活性。
至于您的数据注意事项,任何服务都可以使用状态进行编码,以便缓存数据等。
多个请求将要求您使用WCF并发。您想在服务主机上设置属性:
[System.ServiceModel.ServiceBehavior(UseSynchronizationContext = false,
InstanceContextMode = System.ServiceModel.InstanceContextMode.PerCall,
ConcurrencyMode = System.ServiceModel.ConcurrencyMode.Multiple)]
public class MyService : IMyService
{
}
WCF是一个大野兽,我建议你看一下Juval Lowy的书以及你能得到的任何其他东西,你不会在一天内学到它。
答案 3 :(得分:1)
可能有点偏离主题但它确实解决了考虑因素四。
如果您最终使用自托管,并且需要“尽可能配置端点”,您可能需要查看Managed Services Engine。 MSE是Microsoft Services创建的一个开源产品,可让您虚拟化您的服务。基本上,它是一个WCF主机,它使用自己的存储库中的元数据来公开服务。一些功能包括:支持服务的并排版本控制,启用/禁用服务操作的能力,将操作映射到端点的能力,将策略应用于操作的能力。
我不确定它是否符合您的需求,但值得一看 - 特别是如果您需要非常可配置。