none
将wcf部署到NLB群集中的问题 RRS feed

  • 问题

  • 目前我讲WCF部署到了NLB群集中, A和B两台服务器,

    WCF协议采用TCP, NLB 的设置为单播,

    客户端发出一个请求到NLB 的公共IP, NLB会随机发送到A或B服务器,

    但是,除非客户机退出,该客户端C1只要发出的请求都会始终在一台服务器上。比如,客户端第一次请求,是A服务器处理的,那么只要A一直在调用服务,那么C1的所有请求都自动路由到A服务器上。

     我要的效果是 客户端每次请求,是A或B 随机一个台,而不是固定到其中一台。

    我修改了下我的程序,每次客户端代理类调用服务完毕,加上Abort(), 就可以实现,下次调用是随机被分配到A或者B服务器。

    如果不加Abort(),而 使用Close(), 调用仍然聚集在一台机器上。

    不知道我的问题,说清楚了没有。

     

    ===================

    我想既然使用了wcf 做分布式,就应该考虑分布式部署,然后考虑负载的问题。

     

     




    2011年4月11日 9:34

答案

全部回复

  • 我想问一下你服务使用的绑定,WCf是不是使用了回话?

    WCF回话机制是,一个客户端Proxy会对应一个服务端实例,也就是这个Proxy发出的请求,都是由一个服务实例来处理。

    如果你使用了回话,比如NetTcpBinding,默认就使用回话,那么客户端同一个Proxy的请求,都会由一个服务实例处理。

    你可以把服务端的实例回话模式,修改为PerCall,也就是单调,每个请求,都是由一个服务实例处理。

     


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

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

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

    Windows Azure中文技术论坛

    2011年4月12日 3:13
    版主
  • 我也估计是会话的问题,关闭掉会话吧。
    快乐在于能够长时间的为自己认为值得的事情努力工作,不管它是什么。
    2011年4月12日 3:59
  • namespace WCFService
    {
      [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall)]
      public class WCFServices : IServices
      {
      	..............
      }
    }
    

    这个是服务的代码,我使用的是percall
    2011年4月13日 1:43
  • namespace WCFService
    {
     [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall)]
     public class WCFServices : IServices
     {
     	..............
     }
    }
    

    这个是服务的代码,我使用的是percall
    绑定是什么? 有启用会话吗?
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

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

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

    Windows Azure中文技术论坛

    2011年4月13日 2:25
    版主
  • 用的 netTcpBinding,会话没配置过。 

    <netTcpBinding>
    
    				<binding name="NewBinding20M" closeTimeout="00:30:00" openTimeout="00:30:00"
    
    				 receiveTimeout="05:00:00" sendTimeout="05:00:00" maxConnections="1000"
    
    				 maxReceivedMessageSize="2147483647">
    
    					<readerQuotas maxDepth="64" maxStringContentLength="2147483647"
    
    					 maxArrayLength="2147483647" maxBytesPerRead="10240" maxNameTableCharCount="16384" />
    
    					<security mode="None" />
    
    				</binding>
    
    			</netTcpBinding>
    
    

     

    2011年4月13日 3:02
  • namespace WCFService
    {
     [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall)]
     public class WCFServices : IServices
     {
      int m_Counter = 0;
        /// <summary>
        /// 测试联通
        /// </summary>
        string IServices.Test()
        {
          m_Counter++;
          return m_Counter.ToString();
        }
     }
    }
    

    测试下列代码,每次都返回1

    应该每次都是新的实例。

     

    2011年4月13日 3:12
  • namespace WCFService
    
    {
    
     [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall)]
    
     public class WCFServices : IServices
    
     {
    
     int m_Counter = 0;
    
      /// <summary>
    
      /// 测试联通
    
      /// </summary>
    
      string IServices.Test()
    
      {
    
       m_Counter++;
    
       return m_Counter.ToString();
    
      }
    
     }
    
    }
    
    

    测试下列代码,每次都返回1

    应该每次都是新的实例。

     


    netTcpBinding默认启用会话。

    你可以在绑定里设置Session为False。

    客户端和服务端都设置下。

     


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

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

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

    Windows Azure中文技术论坛

    2011年4月13日 5:00
    版主
  • netTcpBinding默认启用会话。

    你可以在绑定里设置Session为False。

    客户端和服务端都设置下。

     

    这是是设置哪里? <reliableSession enabled = "false"/>

    enabled  属性不存在。msdn上如此写,调试不过

     


    2011年4月13日 7:00
  • WCF 深度绑定


    貌似nettcpbinding 不能无会话
    2011年4月13日 7:29
  • WCF 深度绑定


    貌似nettcpbinding 不能无会话


    不能无会话?

     


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

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

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

    Windows Azure中文技术论坛

    2011年4月13日 8:22
    版主
  • netTcpBinding默认启用会话。

    你可以在绑定里设置Session为False。

    客户端和服务端都设置下。

     

    这是是设置哪里? <reliableSession enabled = "false"/>

    enabled  属性不存在。msdn上如此写,调试不过

     



    这个直接在绑定里设置啊

    <reliableSession enabled = "false"/>


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

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

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

    Windows Azure中文技术论坛

    2011年4月13日 8:23
    版主
  • reliableSession class

    中没有 属性 enabled的属性, 当然这么配也不对


    MSDN上有介绍啊。

    http://msdn.microsoft.com/zh-cn/library/ms731343.aspx

    <reliableSession ordered="Boolean"
                inactivityTimeout="TimeSpan"
                enabled="Boolean" />


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

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

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

    Windows Azure中文技术论坛

    • 已标记为答案 castlooo 2011年4月13日 9:54
    2011年4月13日 9:44
    版主
  • 应该是搞定了~ THANKS XU!


    2011年4月13日 9:53
  • 应该是搞定了~ THANKS XU!



    那就好啊。

    Welcome~

     

    记得请客吃饭哈哈

    我还一直以为我记错了


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

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

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

    Windows Azure中文技术论坛

    2011年4月13日 10:34
    版主