Мне нужно выполнить background операцию, которая занимает много времени в моем WCF-сервисе. Сервис не должен быть заблокирован во время выполнения этой операции. Вызов операции происходит из контроллера.
Server Side:
[ServiceContract]
public interface IServiceContract
{
[OperationContract]
System.Threading.Tasks.Task
public class HelloService : IServiceContract
{
public async System.Threading.Tasks.Task
Client side:
public partial class HelloServiceClient : ClientBase
Использование в контроллере:
public async System.Threading.Tasks.Task
После этого я отправила 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
Комментариев нет:
Отправить комментарий