Загрузка изображений через WCF против WebClient - PullRequest
3 голосов
/ 30 апреля 2009

Я извлекаю данные (изображения, 200-400 КБ) из службы WCF в клиент Silverlight и замечаю, что Silverlight останавливается на долю секунды каждый раз, когда приходит такое сообщение. Это не очень серьезно, но анимация останавливается на некоторое время, и весь пользовательский опыт разрушен.

Время вопроса:

1) Как вы думаете, было бы выгодно использовать вместо него WebClient?

2) Десериализует ли "обычный" клиент WCF в Silverlight (под "нормальным", я имею в виду управляемый событиями) контракты данных в основном (вызывающем) потоке или в фоновом режиме?

3) Считаете ли вы, что накладные расходы, необходимые для десериализации бинарного объекта из контракта данных в XML (+ больший объем данных благодаря XML-кодировке Base64), больше / меньше, чем дополнительная передача данных на сервер (в этом случае контракт данных будет содержать только URL к изображению и чем я мог бы использовать WebClient для его получения - отсюда еще одна поездка)?

4) Можно ли создать изображение из массива byte [] в фоновом потоке (не в потоке пользовательского интерфейса)?

Любая помощь, идеи, предложения высоко ценится.

Спасибо

Karol

PS: я не могу использовать DeepZoom, поскольку бизнес-требования на самом деле не соответствуют сценариям DeepZoom.

Ответы [ 2 ]

0 голосов
/ 01 мая 2009

Вы также можете просто использовать класс обработчика HTTP на стороне сервера, который возвращает изображение. Я предполагаю, что вы решили использовать службу WCF, потому что на стороне сервера есть некоторая логика, которая определяет, какое изображение должно быть возвращено. Используя HTTP-обработчик, у вас будет возможность выполнить эту логику на стороне сервера и вернуть изображение за один прием.

Пусть обработчик вызовет службу WCF, чтобы получить URL-адрес, получить изображение и вернуть его в поток ответов HTTP. Если вы правильно установите тип MIME, клиент (в данном случае Silverlight) не будет знать разницу.

0 голосов
/ 30 апреля 2009

Основная цель WCF - предоставить средства для передачи структурированных данных из одного места в другое. Я не думаю, что изображения предназначены для этого. Я думаю, что использование WebClient, вероятно, будет работать намного лучше и быстрее. Кроме того, вам может потребоваться немного больше узнать, есть ли другое решение, специально предназначенное для загрузки файлов ресурсов с сервера с помощью Silverlight.


UPDATE: На самом деле, если вы просто используете обычный элемент управления изображением, вы можете просто установить (или изменить) свойство Source на новое растровое изображение - это автоматически инициирует загрузку изображения с сервера:

img.Source = new BitmapImage(new Uri("http://the.image.url/image.jpg"));

Затем вы можете программно добавить элемент управления изображением в документ Silverlight.

...