2009-04-30 52 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文檔中。