#c_sharp #wcf
Мне нужно выполнить background операцию, которая занимает много времени в моем WCF-сервисе. Сервис не должен быть заблокирован во время выполнения этой операции. Вызов операции происходит из контроллера. Server Side: [ServiceContract] public interface IServiceContract { [OperationContract] System.Threading.Tasks.TaskGetMessages(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
Ответы
Ответ 1
Проверила на чистом проекте и заметила что на реальном проекте для сервиса было указано [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]. Проблема решилась добавлением ConcurrencyMode.Multiple
Комментариев нет:
Отправить комментарий