我使用Castle Windsor WCF Facility。 docs说:
如果您要从WCF激活切换到Windsor的WcfFacility,请确保从服务类型中删除ServiceBehavior属性。
如何控制并发模式?
在香草WCF我做:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
似乎在WCF Facility中,并发模式设置为Single,我无法找到改变它的方法。
编辑:客户端异步调用BeginFoo方法,并且调用在客户端没有阻塞。 我将日志记录放在BeginFoo方法的开头和结尾处。日志表明服务器调用一次只进入和退出一次BeginFoo方法。
以下客户端调用会神奇地排队。
答案 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)]
这不会让客户端等待响应,这可以作为或替换多个或可重入的并发模型