Изменение ConcurrencyMode

75
9

Я использую Castle Windsor WCF Facility. Документы говорят:

Если вы переключаетесь с активации WCF на Windsor WcfFacility, обязательно удалите атрибут ServiceBehavior из типа службы.

Как я могу управлять режимом параллелизма?

В vanilla WCF я бы сделал:

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

Похоже, что с WCF Facility в режиме совпадения установлен Single, и я не могу найти способ его изменить.

EDIT: клиент вызывает асинхронно метод BeginFoo, и вызов не блокируется на стороне клиента. Я записываю журнал в начале и в конце метода BeginFoo. Журналы показывают, что вызов сервера входит и вызывается методом BeginFoo только один раз за раз.

Следующие вызовы клиентов получают магическую очередь.

спросил(а) 2021-01-19T19:28:36+03:00 2 месяца, 3 недели назад
1
Решение
75

Я понял.

Если вы не укажете атрибут, то WCF Facility создаст для вас и добавит его в

ServiceHost.Description.Behaviors

Таким образом, решение заключается в добавлении атрибута в коллекцию Behaviors (да, атрибут реализует IServiceBehavior, немного контрапункт, хотя...) и устанавливает соответствующие свойства там.

Я добавляю поведение в расширении WcfServiceModel OnCreated. Поскольку на данный момент поведение по умолчанию уже существует, мне пришлось сначала удалить его.

ответил(а) 2021-01-19T19:28:36+03:00 2 месяца, 3 недели назад
44

Для всех, кого интересует, вот код для того, что 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;
}

ответил(а) 2021-01-19T19:28:36+03:00 2 месяца, 3 недели назад
-8

Как я пробовал Некоторые способы, вы можете использовать

 [OperationContract(IsOneWay=true)]

это не заставит клиента ждать ответа, и это может работать как или заменить множественную или повторную модель параллелизма

ответил(а) 2021-01-19T19:28:36+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема