2013-02-12 4 views
1

Я разрабатываю сервер API, используя библиотеку ServiceStack для .NET 3.5 (новый опыт для меня), предназначенный для доступа к толстым клиентским приложениям Windows Forms. Когда пользователь нажимает кнопку, которая приводит к запросу REST на сервер, я хотел бы отобразить индикатор выполнения, который показывает ход вызова RPC.Отчет о прогрессе вызова RPC

Мои услуги обычно следуют одна из следующих моделей:

  • Клиент посылает в списке идентификаторов, и рассчитывает получить список объектов, один объект за ID. В этом случае процент прогресса можно было бы рассчитать как (number of objects received so far)/(total number of objects requested)
  • Клиент отправляет запрос и ожидает получить список неизвестной длины. На стороне обслуживания мы извлекаем список объектов (из кеша, базы данных, вычисления, что угодно), сериализуем его, а затем записываем сериализованные данные в поток ответов HTTP. В этом случае процент прогресс может быть оценен как (number of bytes received so far)/(Content-Length of the HTTP response)

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

Есть ли способ сделать это, используя ServiceStack's JsonServiceClient, XmlServiceClient или любой подкласс ServiceClientBase в целом? Если нет, то что было бы хорошим способом добиться того, чего я хочу, без лишней дополнительной работы? Я понимаю, что я мог бы написать свою собственную реализацию клиента REST с нуля, но я бы предпочел избежать этого, если смогу.

ответ

1

Один из подходов состоит в том, чтобы взглянуть на паб/sub, который предоставляет ServiceStack. Вы можете отправить первоначальный запрос и вернуть обратно корреляционный идентификатор. Затем вы хотите, чтобы толстые клиенты подписывались на событие. Событие может содержать данные для клиента для расчета прогресса.

ServiceStack Redis Pub/Sub

+0

Похоже, что это будет работать только для Redis, в то время как мне нужно, в общем, применимое решение. – Bugmaster

+0

Речь идет не о работе «за» Redis, а в том, что Redis используется для создания прочных очередей. Как сказал мифц выше, я считаю, что его ответ более тесно связан с тем, что вы описали. – CodeMonkeyKing

1

Вы не можете использовать ServiceStack's service clients, которые в настоящее время не подвергать какой-либо способ подключиться к загрузке URL-адресов, чтобы иметь возможность сообщить прогресс бар.

Я бы рекомендовал использовать строку HTTP Client that does support progress updates для загрузки строки json. Чтобы вернуть JSON из службы ServiceStack, вы можете использовать HTTP-заголовок Accept: application/json или добавить в QueryString ? Format = json.

После того, как строка JSON загружены полностью преобразовать его в DTO с:

var json = ...; //download with progress 
var dto = json.FromJson<MyDto>(); 
+0

Ack ... Я боялся, что вы это скажете. Таким образом, похоже, что я буду писать собственный клиент ServiceStack. Есть ли, по крайней мере, легкий способ для меня аргументировать свои аргументы? Я хотел бы сказать что-то вроде: var result = myClient.Post (новые GetDepartmentCustomers (1234), MyProgressHandlerFn). Это похоже на то, как я использую 'jsonClient' сегодня. – Bugmaster

+0

Вам просто нужно сериализовать DTO для * marshall аргументов * ie 'var jsonToPost = requestDto.ToJson();' – mythz

+0

Я вижу, поэтому я сериализую сам DTO, затем отправляю запрос вручную и обрабатываю ответ вручную, который работает , Похоже, мне также понадобится существенно скопировать/вставить код обработки исключений из «ServiceClientBase», правильно?В настоящее время существующие клиенты службы будут переводить исключения для моей службы, что удобно ... – Bugmaster

Смежные вопросы