更改ConcurrencyMode

时间:2014-06-26 09:13:42

标签: c# wcf concurrency castle-windsor wcffacility

我使用Castle Windsor WCF Facility。 docs说:

  

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

如何控制并发模式?

在香草WCF我做:

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

似乎在WCF Facility中,并发模式设置为Single,我无法找到改变它的方法。

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

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

3 个答案:

答案 0 :(得分:2)

我明白了。

如果您未指定该属性,则WCF Facility会为您创建一个属性并将其添加到

ServiceHost.Description.Behaviors

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

我在WcfServiceModel的扩展名OnCreated中添加了行为。至于此时默认行为已经存在,我必须先删除它。

答案 1 :(得分:0)

对于任何有兴趣的人,这里是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;
}

答案 2 :(得分:-3)

我试过某些方法, 你可以使用

 [OperationContract(IsOneWay=true)]

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