Страницы

Поиск по вопросам

понедельник, 29 октября 2018 г.

Asynchronous Operation in WCF

Мне нужно выполнить background операцию, которая занимает много времени в моем WCF-сервисе. Сервис не должен быть заблокирован во время выполнения этой операции. Вызов операции происходит из контроллера. Server Side:
[ServiceContract] public interface IServiceContract { [OperationContract] System.Threading.Tasks.Task GetMessages(int sleep); }
public class HelloService : IServiceContract { public async System.Threading.Tasks.Task GetMessages(int sleep) { var task = System.Threading.Tasks.Task.Factory.StartNew(() => { Thread.Sleep(sleep); return "Return from Server after: " + sleep; }); return await task.ConfigureAwait(false); } }
Client side:
public partial class HelloServiceClient : ClientBase, IServiceContract { public System.Threading.Tasks.Task GetMessages(int sleep) { return Channel.GetMessages(sleep); }
Использование в контроллере:
public async System.Threading.Tasks.Task GetResult(int sleep) { var client = DAACommunicationServiceHelper.CreateClient(); SystemLogManager.Current.Write("Start GetResult: " + sleep); var result = await client.GetMessages(sleep); SystemLogManager.Current.Write("GetResult = " + result); SystemLogManager.Current.Write("End GetResult: " + sleep); return result; }
После этого я отправила 2 запроса:
POST https://localhost:44374/Services/Maintenance.asmx/GetResult HTTP/1.1 {"sleep":1000}
и сразу
POST https://localhost:44374/Services/Maintenance.asmx/GetResult HTTP/1.1 {"sleep":1}
Я ожидала что запрос "sleep":1 выполниться быстрее, но WCF-сервис был заблокирован пока не выполнился запрос "sleep":10000.
Вот что в логах:
2017-06-14 11:25:16.1684 INFO Start GetResult: 10000 2017-06-14 11:25:19.3156 INFO Start GetResult: 1 2017-06-14 11:25:26.1802 INFO GetResult = Return from Server after: 10000 2017-06-14 11:25:26.1802 INFO End GetResult: 10000 2017-06-14 11:25:26.1802 INFO GetResult = Return from Server after: 1 2017-06-14 11:25:26.1802 INFO End GetResult: 1
UPD: Почему WCF-сервис был заблокирован пока не выполнился запрос "sleep":10000? Мне нужно чтобы WCF-сервис выполнял операцию асинхронно и запросы возвращались по мере выполнения. В логах я рассчитывала увидеть такое:
2017-06-14 11:25:16.1684 INFO Start GetResult: 10000 2017-06-14 11:25:19.3156 INFO Start GetResult: 1 2017-06-14 11:25:26.1802 INFO GetResult = Return from Server after: 1 2017-06-14 11:25:26.1802 INFO End GetResult: 1 2017-06-14 11:25:26.1802 INFO GetResult = Return from Server after: 10000 2017-06-14 11:25:26.1802 INFO End GetResult: 10000


Ответ

Проверила на чистом проекте и заметила что на реальном проекте для сервиса было указано [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]. Проблема решилась добавлением ConcurrencyMode.Multiple

Комментариев нет:

Отправить комментарий