none
关于WCF host 在IIS中的ServiceHost实例问题 RRS feed

  • 问题

  • 一般非IIS的宿主环境下,我们是自己通过创建ServiceHost对象实例来开启服务的,比如Console的程序中,我们在Main方法下去创建,那么可以很明确的知道这个ServiceHost对象只会被实例话一次,因为Main方法只会被执行一次。但是在IIS中ServiceHost不是由我们控制去实例化的,我想问的是在服务部署在IIS后,整个服务运行过程中,ServiceHost对象只会有一个吗?还是说IIS有可能会去实例化多次。如果是多次的话是前一个关闭后再去创建第二次的还是会并存多个.
    AndersTan
    2011年2月14日 2:16

答案

  • 每个service-name>.svc都对应着1个ServiceHost.

    IIS或WAS使用ServiceHostingEnvironment.EnsureServiceAvailable激活配置的Service,用Reflector可以查看这个方法的实现,功能大致是:

    在一个HashTable中,按VirtualPath为key保存Service关联的ServiceHostBase实例,即每个不同VirtualPath的Service都联系 且 仅联系着1个ServiceHostBase对象,如果对应的VirtualPath尚没有ServiceHost,那么创建一个新的,并记录在这个HastTable里;如果已经有了,就不必重复创建了.

    VirtualPath就是这种东西: /<app-name>/<sub-directory/<service-name>.svc

    而ServiceHostingEnvironment在AppDomain范围内有效

    • 已标记为答案 Anders Tan 2011年2月15日 13:42
    2011年2月15日 9:54

全部回复

  • ServiceHose就是IIS本身,就那1个

    当然,有时IIS会自已重启一下,没验证过,这时应该是关第1个,再启第2个;应该不会让2个并存,否则就会有个调度的问题

    2011年2月14日 9:58
  • 谢谢 AceBear的回复,不知道有没有这方面的资料可以提供一下。另外想问一下,在host IIS的情况下,对Service类上应用InstanceContextMode, ConcurrencyMode设置,还能保证设置所对应的原有意义吗?比如说会不会在IIS上的关系,无论是设置了InstanceContextMode为何值,都视为PerCall ?同样对于ConcurrencyMode呢?
    AndersTan
    2011年2月15日 1:31
  • http://msdn.microsoft.com/zh-cn/library/system.servicemodel.servicehost.aspx

    实现 服务模型编程模型所使用的主机。

    当您没有使用 Internet 信息服务 (IIS) 或 Windows 激活服务 (WAS) 公开服务时,请使用 ServiceHost 类来配置和公开服务以供客户端应用程序使用。 IIS 和 WAS 均代表您与 ServiceHost 对象交互。

    若要公开一项服务以供调用方使用, 需要完整的服务说明(由 ServiceDescription 类表示)。 ServiceHost 类根据服务类型和配置信息创建 ServiceDescription,然后再使用该说明为说明中的每个终结点创建 ChannelDispatcher 对象。

    使用 ServiceHost 对象加载服务、配置终结点、应用安全设置并启用侦听程序来处理传入的请求。

     

    我猜测应该是可以多个,而单单是限制在一个。

    可以想象一下,IIS的工作进程的个数 都没说一定限制为1,ServiceHost 宿主实例 为什么要限制为1呢?

    而且如果只有一个 会不会影响并发请求时的性能问题?

     


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年2月15日 2:40
    版主
  • 那按照你所说的,就是IIS会对一个 abc.svc(其中只有一个服务)文件所指向的服务创建多个ServiceHost对象?并且会是同时存在?如果是这样的话,是不是针对abc.svc所创建的每个ServiceHost对象都在不同的应用程序域里面?
    AndersTan
    2011年2月15日 3:39
  • 这个有时间可以查下资料。

    但是可以肯定要使用AppDomain,

     


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年2月15日 4:21
    版主
  • 每个service-name>.svc都对应着1个ServiceHost.

    IIS或WAS使用ServiceHostingEnvironment.EnsureServiceAvailable激活配置的Service,用Reflector可以查看这个方法的实现,功能大致是:

    在一个HashTable中,按VirtualPath为key保存Service关联的ServiceHostBase实例,即每个不同VirtualPath的Service都联系 且 仅联系着1个ServiceHostBase对象,如果对应的VirtualPath尚没有ServiceHost,那么创建一个新的,并记录在这个HastTable里;如果已经有了,就不必重复创建了.

    VirtualPath就是这种东西: /<app-name>/<sub-directory/<service-name>.svc

    而ServiceHostingEnvironment在AppDomain范围内有效

    • 已标记为答案 Anders Tan 2011年2月15日 13:42
    2011年2月15日 9:54
  • 非常感谢AceBear,你的这段答复很给力!


    AndersTan
    2011年2月15日 13:42
  • 每个service-name>.svc都对应着1个ServiceHost.

    IIS或WAS使用ServiceHostingEnvironment.EnsureServiceAvailable激活配置的Service,用Reflector可以查看这个方法的实现,功能大致是:

    在一个HashTable中,按VirtualPath为key保存Service关联的ServiceHostBase实例,即每个不同VirtualPath的Service都联系 且 仅联系着1个ServiceHostBase对象,如果对应的VirtualPath尚没有ServiceHost,那么创建一个新的,并记录在这个HastTable里;如果已经有了,就不必重复创建了.

    VirtualPath就是这种东西: /<app-name>/<sub-directory/<service-name>.svc

    而ServiceHostingEnvironment在AppDomain范围内有效

    这个回答是错误的。 WCF服务托管在IIS里时,ServiceHost实例的数量跟svc文件没有关系。 每个AppDomain至少包含一个ServiceHost实例。
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年2月19日 15:25
    版主