2

我正在使用温莎城堡 WCF 设施。文档说:

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

那么如何控制并发模式?

在香草 WCF 中,我会这样做:

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

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

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

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

4

3 回答 3

2

我想到了。

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

ServiceHost.Description.Behaviors

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

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

于 2014-06-27T16:10:35.297 回答
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;
}
于 2016-09-19T11:05:06.170 回答
-3

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

 [OperationContract(IsOneWay=true)]

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

于 2014-06-26T11:53:51.140 回答