WCF параллельное выполнение запросов
От: GTmAster  
Дата: 21.02.12 04:11
Оценка:
Здравствуйте все!
Осваиваю wcf, столкнулся с проблемой. Гугление не помогло.
Имеется wcf сервис, поднимаемый в обычном managed-приложении.

Uri address = new Uri("http://localhost:8000");

service = new ServiceHost(typeof(ManagerService), address);
                        
try
{
    service.AddServiceEndpoint(typeof(ManagerService), new BasicHttpBinding(), "Manager");
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;

    service.Description.Behaviors.Add(smb);
    service.Open();

    log.Debug("Запущен сервис");
}


Сервиc представлен как:
    [ServiceContract]
    class ManagerService
    {
        //...

        [OperationContract]
        public string GetModuleCalc(string ModuleName, string param)
        {
             //...
        }

        [OperationContract]
        public void SayHello(string MyUri, string[] MyModules, Classes.ComputerParams MyComputer)
        {
             //...
        }

        [OperationContract]
        public string Calc(string module, string param)
        {
             //...
        }
    }


Проблема в том, что пока сервис не выполнит один запрос, он не начинает выполнять второй и т.д. То есть запросы выполняются строго по очереди без параллельной обработки. Как сделать так, чтобы сервис мог обрабатывать запросы параллельно?
Пробовал играться со свойствами ServiceBehavior, а именно с ConcurrencyMode и InstanceContextMode, но желаемого поведения не получил, сервис все равно выполняет запросы строго по очереди.
wcf параллельное выполнение .net
Re: WCF параллельное выполнение запросов
От: _d_m_  
Дата: 21.02.12 04:18
Оценка:
Здравствуйте, GTmAster, Вы писали:

GTA>Проблема в том, что пока сервис не выполнит один запрос, он не начинает выполнять второй и т.д. То есть запросы выполняются строго по очереди без параллельной обработки. Как сделать так, чтобы сервис мог обрабатывать запросы параллельно?

GTA>Пробовал играться со свойствами ServiceBehavior, а именно с ConcurrencyMode и InstanceContextMode, но желаемого поведения не получил, сервис все равно выполняет запросы строго по очереди.

http://www.rsdn.ru/?article/dotnet/WCF_MultithreadClient.xml
Автор(ы): Иван Бодягин
Дата: 12.09.2009
Статья содержит советы по построению высокопроизводительных и масштабируемых WCF-приложений.
Re: WCF параллельное выполнение запросов
От: TK Лес кывт.рф
Дата: 21.02.12 04:54
Оценка:
Здравствуйте, GTmAster, Вы писали:

GTA>Пробовал играться со свойствами ServiceBehavior, а именно с ConcurrencyMode и InstanceContextMode, но желаемого поведения не получил, сервис все равно выполняет запросы строго по очереди.


На подобное http://www.rsdn.ru/forum/dotnet/4243846.1.aspx
Автор:
Дата: 21.04.11
поведение не похоже ?
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: WCF параллельное выполнение запросов
От: scale_tone Норвегия https://scale-tone.github.io/
Дата: 21.02.12 07:12
Оценка:
Здравствуйте, GTmAster, Вы писали:

GTA>Проблема в том, что пока сервис не выполнит один запрос, он не начинает выполнять второй и т.д. То есть запросы выполняются строго по очереди без параллельной обработки. Как сделать так, чтобы сервис мог обрабатывать запросы параллельно?

GTA>Пробовал играться со свойствами ServiceBehavior, а именно с ConcurrencyMode и InstanceContextMode, но желаемого поведения не получил, сервис все равно выполняет запросы строго по очереди.

По умолчанию, сервис обязан выполнять запросы параллельно. Нужно прилагать доп. усилия как раз, чтобы он перестал это делать.
Но давайте сначала поймем, каким способом Вы проверяете, параллельно ли оно работает. Ну и код методов желательно бы посмотреть...
Re: WCF параллельное выполнение запросов
От: rumatavz  
Дата: 21.02.12 08:54
Оценка: +1
Хост приложение не WinForms часом?
Re[2]: WCF параллельное выполнение запросов
От: GTmAster  
Дата: 22.02.12 04:04
Оценка:
Здравствуйте, _d_m_, Вы писали:

___>Здравствуйте, GTmAster, Вы писали:


GTA>>Проблема в том, что пока сервис не выполнит один запрос, он не начинает выполнять второй и т.д. То есть запросы выполняются строго по очереди без параллельной обработки. Как сделать так, чтобы сервис мог обрабатывать запросы параллельно?

GTA>>Пробовал играться со свойствами ServiceBehavior, а именно с ConcurrencyMode и InstanceContextMode, но желаемого поведения не получил, сервис все равно выполняет запросы строго по очереди.

___>http://www.rsdn.ru/?article/dotnet/WCF_MultithreadClient.xml
Автор(ы): Иван Бодягин
Дата: 12.09.2009
Статья содержит советы по построению высокопроизводительных и масштабируемых WCF-приложений.


Статью читал, но к сожалению, никакие параметры не помогают.
Re[2]: WCF параллельное выполнение запросов
От: GTmAster  
Дата: 22.02.12 04:05
Оценка:
Здравствуйте, TK, Вы писали:

TK>Здравствуйте, GTmAster, Вы писали:


GTA>>Пробовал играться со свойствами ServiceBehavior, а именно с ConcurrencyMode и InstanceContextMode, но желаемого поведения не получил, сервис все равно выполняет запросы строго по очереди.


TK>На подобное http://www.rsdn.ru/forum/dotnet/4243846.1.aspx
Автор:
Дата: 21.04.11
поведение не похоже ?


Вроде нет, не похоже. Запросы происходят к разным методам. Validate не используется.
Re[2]: WCF параллельное выполнение запросов
От: GTmAster  
Дата: 22.02.12 04:08
Оценка:
Здравствуйте, scale_tone, Вы писали:

_>Здравствуйте, GTmAster, Вы писали:


GTA>>Проблема в том, что пока сервис не выполнит один запрос, он не начинает выполнять второй и т.д. То есть запросы выполняются строго по очереди без параллельной обработки. Как сделать так, чтобы сервис мог обрабатывать запросы параллельно?

GTA>>Пробовал играться со свойствами ServiceBehavior, а именно с ConcurrencyMode и InstanceContextMode, но желаемого поведения не получил, сервис все равно выполняет запросы строго по очереди.

_>По умолчанию, сервис обязан выполнять запросы параллельно. Нужно прилагать доп. усилия как раз, чтобы он перестал это делать.

_>Но давайте сначала поймем, каким способом Вы проверяете, параллельно ли оно работает. Ну и код методов желательно бы посмотреть...

Происходит запрос к одному из методов. В этом методе происходит запрос к этому же сервису (т.е. на localhost) но к другому методу. В итоге второй запрос не выполняется, вылетая по timeout.
P.S. Да, это бред подключаться снова к сервису вместо просто вызова нужного метода, просто проверка работоспособности.
Re[2]: WCF параллельное выполнение запросов
От: GTmAster  
Дата: 22.02.12 04:09
Оценка:
Здравствуйте, rumatavz, Вы писали:

R>Хост приложение не WinForms часом?


Оно самое. В этом причина странного поведения?
Re[3]: WCF параллельное выполнение запросов
От: scale_tone Норвегия https://scale-tone.github.io/
Дата: 22.02.12 04:47
Оценка:
Здравствуйте, GTmAster, Вы писали:

GTA>Происходит запрос к одному из методов. В этом методе происходит запрос к этому же сервису (т.е. на localhost)


Это как?! И зачем? Т.е. это что же, у Вас сервис является собственным клиентом?!
Покажите код.

GTA> но к другому методу. В итоге второй запрос не выполняется, вылетая по timeout.


И какое конкретно исключение?

GTA>P.S. Да, это бред подключаться снова к сервису вместо просто вызова нужного метода, просто проверка работоспособности.


Проверка работоспособности чего?
Чтобы проверить параллельность работы сервиса Вы вставьте Thread.Sleep() в его методы, запустите два клиента и убедитесь, что они не ждут друг друга. По умолчанию InstanceContextMode выставлен в PerSession, Вы его (судя по коду) не переопределяли, так что создадутся два экземпляра сервиса для каждого клиента, которые будут прекрасно работать.
Re[3]: WCF параллельное выполнение запросов
От: rumatavz  
Дата: 22.02.12 07:17
Оценка:
Прична в том, что если создавать сервисы в гуёвом потоке они будут обрабатывать запросы последовательно. Скорее всего это связанно с тем, что поток является STAThread. Так как менять его тип на MTAThread не корректно (могут быть проблемы, например, с буфером обмена) то самый простой путь — создать новый поток и в неём создать и открыть сервисы.
Re[3]: WCF параллельное выполнение запросов
От: SergeyT. США http://sergeyteplyakov.blogspot.com/
Дата: 22.02.12 07:51
Оценка: 37 (3)
Здравствуйте, GTmAster, Вы писали:

R>>Хост приложение не WinForms часом?


GTA>Оно самое. В этом причина странного поведения?


Да, именно из-за этого. Такое поведение by-design и оно не связано с STA/MTA моделями, а связано с тем, что сервис по умолчанию использует текущий контрекст синхронизации для обработки запросов, а поскольку винформы используют соственный контекст синхронизации, то и получается что все вызовы сервиса выполняются в потоке UI *последовательно*.

Контролируется это поведение атрибутом ServiceBehaviorAttribute.UseSynchronizationContext значение по-умолчанию которого равно true.

Просто добавьте атрибут на свой сервис:

[ServiceBehavior(UseSynchronizationContext = true)]
class MyService : IMyContract
{...}


И будет все ок.

Вот пара дополнительных ссылок:
1. Synchronization Contexts in WCF by Juval Lowy
и вот, практически тоже самое из книги Juval Lowy:
2. Глава Concurrency Management из книги Juval Lowy Programming WCF Services
Re[3]: WCF параллельное выполнение запросов
От: Nikolay_P_I  
Дата: 22.02.12 09:58
Оценка:
Здравствуйте, GTmAster, Вы писали:

GTA>Происходит запрос к одному из методов. В этом методе происходит запрос к этому же сервису (т.е. на localhost) но к другому методу. В итоге второй запрос не выполняется, вылетая по timeout.

GTA>P.S. Да, это бред подключаться снова к сервису вместо просто вызова нужного метода, просто проверка работоспособности.

Это, как-бы нормально, если reentrant нет. А если оно есть — то уже нет многопоточности. Вывод — не чешите левой рукой правое ухо
Re[4]: WCF параллельное выполнение запросов
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.02.12 14:48
Оценка:
Здравствуйте, SergeyT., Вы писали:

ST>Просто добавьте атрибут на свой сервис:


ST>
ST>[ServiceBehavior(UseSynchronizationContext = true)]
ST>class MyService : IMyContract
ST>{...}
ST>


Наверное все таки false?
... << RSDN@Home 1.2.0 alpha 5 rev. 21 on Windows 7 6.1.7601.65536>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.