【问题标题】:Changing ConcurrencyMode更改并发模式
【发布时间】:2014-06-26 09:13:42
【问题描述】:

我正在使用 Castle Windsor WCF 设施。 docs 说:

如果您从 WCF 激活切换到 Windsor 的 WcfFacility,请确保从服务类型中删除 ServiceBehavior 属性。

然后如何控制并发模式?

在原版 WCF 中我会这样做:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]

似乎使用 WCF Facility 的并发模式设置为 Single,我找不到更改它的方法。

编辑:客户端异步调用 BeginFoo 方法,并且调用在客户端没有阻塞。 我将日志记录放在 BeginFoo 方法的开头和结尾。日志表明服务器调用一次只进入和退出 BeginFoo 方法一次。

以下客户端调用神奇地排队。

【问题讨论】:

    标签: c# wcf concurrency castle-windsor wcffacility


    【解决方案1】:

    我想通了。

    如果您不指定属性,则 WCF 设施会为您创建一个并将其添加到

    ServiceHost.Description.Behaviors
    

    所以解决方案是向 Behaviors 集合添加一个属性(是的,该属性实现了 IServiceBehavior,虽然有点违反直觉......)并在那里设置相关属性。

    我在 WcfServiceModel 的扩展 OnCreated 中添加行为。由于此时默认行为已经存在,我必须先将其删除。

    【讨论】:

      【解决方案2】:

      对于任何感兴趣的人,这里是 dzendras 之前发布的代码:

      static void Main(string[] args) {
          _container = new WindsorContainer();
          _container.AddFacility<WcfFacility>();
          _container.Register(Component.For<IHelloService>()
                                       .ImplementedBy<HelloService>()
                                       .AsWcfService(new DefaultServiceModel().OnCreated(OnCreated)));
      }
      
      private static void OnCreated(ServiceHost serviceHost)
      {
          var serviceBehavior = (ServiceBehaviorAttribute) serviceHost.Description.Behaviors.Single(_ => _ is ServiceBehaviorAttribute);
          serviceBehavior.ConcurrencyMode = ConcurrencyMode.Multiple;
          serviceBehavior.InstanceContextMode = InstanceContextMode.PerSession;
      }
      

      【讨论】:

        【解决方案3】:

        我尝试了一些方法, 你可以使用

         [OperationContract(IsOneWay=true)]
        

        这不会让客户端等待响应,这可以作为或替换多个或可重入并发模型

        【讨论】:

        • 客户端不等待。客户能够立即发出下一个请求。它是不允许并发调用的服务。
        • @dzendras Friyank 刚刚说它不会让客户等待
        • 没问题,您可以在方法级别定义并发模式为,在方法顶部定义 [ServiceBehavior(ConcurrencyMode= ConcurrencyMode.Multiple)] 属性,看看它是否有效
        • @ElectricCoffee:我说问题不在客户端,而是在服务器端。
        • @Fryank:您是否尝试过实际编译您的代码? ServiceBehaviorAttribute 不能在方法上定义...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        • 1970-01-01
        • 2014-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多