Методы WCF с большими наборами результатов - визуальное отслеживание хода передачи - PullRequest
2 голосов
/ 14 сентября 2009

У меня есть службы WCF, которые должны возвращать некоторые наборы данных, которые могут достигать 10 МБ или более, я хочу визуальную обратную связь для пользователя о ходе выполнения, есть ли способ отслеживать ход загрузки?

Мой клиент - Silverlight 3, и в конечном итоге я хотел бы иметь возможность привязать к нему индикатор выполнения; есть идеи?

РЕДАКТИРОВАТЬ: После того, как Щедрый SO автоматически выбрал ответ с голосованием в качестве правильного ответа, когда это не так.

Ответы [ 4 ]

5 голосов
/ 15 сентября 2009

Пример этого есть в проекте кода, см .:

http://www.codeproject.com/KB/WCF/WCF_FileTransfer_Progress.aspx

1 голос
/ 15 сентября 2009

Если у вас один гигантский вызов WCF, то у вас есть только два состояния: все или ничего. Кроме того, WCF имеет максимальный размер транзакции, поэтому возвращение большого набора данных сопряжено с риском превышения этого лимита.

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

Редактировать: добавлено лучшее объяснение.

0 голосов
/ 25 сентября 2009

РЕДАКТИРОВАТЬ : Я ответил на это, думая, что вам нужен загрузчик Silverlight, но на самом деле похоже, что вы хотите загрузчик Silverlight. Вы можете сделать то же самое, что я предложил для загрузчика, за исключением использования HTTP GET, или Binary WCF, или Sockets.

Я написал загрузчик Silverlight 2 с индикатором выполнения и смоделировал его после this one. Он использует HTTP POST для отправки файла на сервер по одной части за раз. Сложность в том, что чем больше ваш POST, тем быстрее будет загружен файл, но индикатор выполнения обновляется только один раз за POST. Поэтому я написал алгоритм, который динамически пытается найти самый большой размер POST, который занимает меньше секунды.

Если вы хотите использовать WCF вместо HTTP POST, это, вероятно, лучше, потому что Silverlight 3 теперь поддерживает двоичную кодировку сообщений:

ИЛИ вы можете написать реализацию сокетов - Silverlight поддерживает это, но это может быть немного сложнее в настройке и требует, чтобы на вашем сервере был открыт порт в диапазоне 4502-4532, а порт 943 открыт для политики файл .

0 голосов
/ 24 сентября 2009

Статья CodeProject может оказаться сложной для работы с Silverlight, поскольку Silverlight имеет доступ только к BasicHttpBinding - хотя похоже, что BasicHttpBinding имеет TransferMode = "Streamed", так что, возможно, это возможно - я не знаю.

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

Тем не менее, я думал, что предложу случайный «другой» подход.

Возможно, вы могли бы сериализовать данные в файл и использовать WebClient для их загрузки. Таким образом, в основном у вас будет WS.GetData (), который будет сохранять файл на сервере и возвращать его имя файла - тогда приложение Silverlight будет использовать WebClient для его загрузки (у которого есть событие DownloadProgressChanged).

Я знаю, что это не то, что вы ищете - просто идея ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...