2009-04-30 64 views
3

我正在从WCF服务向Silverlight客户端提取数据(图像,200-400kb),并注意到Silverlight每次到达此类消息时会停止一小部分秒。这并不是真的严重,但动画停顿了一段时间,整个用户体验都被破坏了。通过WCF和WebClient下载图片

提问时间:

1)你认为这将是有益的,而不是使用Web客户端?

2)Silverlight中的“正常”WCF客户端(通过“正常”我的意思是事件驱动的场景)反序列化主(调用)线程或背景中的数据合约? 3)您是否认为从XML中的数据契约中反序列化二进制对象所需的开销(+由于Base64 XML编码而产生更大的数据大小)比服务器的额外往返更大/更小(在这种情况下,数据契约只会包含图像的URL,比我可以使用WebClient获取它 - 因此另一次旅行)?

4)是否可以在后台线程(而不是UI线程)中从byte []数组创建Image?

任何帮助,意见,建议非常感谢。

感谢,

卡罗尔

PS:我不能使用的DeepZoom因为业务需求真的不匹配的DeepZoom场景。

回答

0

您也可以在返回图像的服务器端使用HTTP Handler类。我假设你选择使用WCF服务,因为服务器端有一些逻辑确定应该返回哪个图像。使用HTTP处理程序,您可以选择在服务器端执行该逻辑并在一次往返中返回图像。

Handler调用WCF服务来获取URL,检索图像并将其返回到HTTP响应流中。如果您正确设置了MIME类型,则客户端(在本例中为Silverlight)将不知道其差异。

+0

感谢史蒂夫,最后我用REST协议创建了第二个终点,因此我可以将图像作为二进制从相同的服务返回,并通过WebClient在Silverlight中使用它。 – 2009-05-01 23:54:43

+0

更新:我做了一些性能测试。如果有人感兴趣:通过REST的原始二进制数据比DataContract的序列化相同的数据快2.5倍。 – 2009-05-02 02:49:26

0

WCF的主要目的是提供从一个地方获取结构化数据的方法。我不认为图像是它的意思。我认为使用WebClient可能会更好,更快地工作。此外,您可能还需要进一步研究是否有其他解决方案专门用于使用Silverlight从服务器下载资源文件。


UPDATE: 其实,如果你只是用你可以设置一个普通的图像控制(或改变)来源属性设置为新位图 - 这将自动触发从服务器位置的图像的下载:

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

然后,您可以编程方式将图像控件添加到您的Silverlight文档中。