回答

2

你可以通過rehosting圖像來解決這個問題。基本上你可以在你的服務器上設置一個wcf服務,作爲地圖的代理,然後當silverlight對你的媒體源進行安全檢查時,它會發現它是由你的服務器「託管」的,那麼它應該讓你渲染它寫入一個可寫位圖。儘管這可能會顯着增加服務器的負載。

+0

+1用於提供替代方案。這是Silverlight的一項安全功能,所以顯然你不能只是'解決'它。 – 2010-06-15 02:48:05

0

如果位圖的來源是另一個域,那麼簡單的答案是否定的。我不確定你是如何嘗試拍攝這個「屏幕截圖」的,但是聽起來好像有很好的安全原因來阻止這一點......當然,完全(讀/寫)像素訪問通常是可用的,當你圖像在本地域中。

解決這個問題的正確方法就是讓Silverlight應用程序需要完全信任,這是自Silverlight 3(並在Silverlight 4中擴展)之後可能實現的。但是,這確實需要它是一個OOB(瀏覽器應用程序),我相信。

1

解決此問題最簡單的方法是確保Silverlight應用程序和圖像託管在同一個域中。既然你問這個問題,我會認爲這是不可能的。

您是否控制託管映像的服務器?如果是這樣,您可以添加一個客戶端訪問策略文件,以啓用跨Silverlight應用程序對圖像的跨域訪問。然後你需要改變你如何使用這些圖像。使用WebClient將圖像下載爲Stream並將Image元素的源直接設置爲該Stream,而不是將Image元素的Source設置爲圖像的URI。如果您這樣做,則在嘗試訪問WriteableBitmap像素時不會遇到跨域訪問衝突。

4

我使用有效的clientaccesspolicy.xml存儲在Amazon Cloudfront服務器上的視頻,以允許Silverlight主機URL的跨域訪問,以下功能不允許我拍攝視頻的屏幕截圖並操縱像素直到它被WebClient下載代替(WebClient支持跨域策略文件,你可以看到它在Fiddler中被請求,MediaElement.Source函數甚至沒有嘗試的東西)

舊的沒有工作的跨域代碼

public LoadVideoFromURL(string url) 
{ 
    var uri = new Uri(url); 

    myMediaElement.Source(uri); 
} 

新的工作跨域代碼

public LoadVideoFromURL(string url) 
{ 
    var uri = new Uri(url); 

    //Request the video 
    var videoDownloader = new WebClient(); 

    videoDownloader.OpenReadCompleted += new OpenReadCompletedEventHandler( 
       (s, args) => myMediaElement.SetSource(args.Result)); 

    videoDownloader.OpenReadAsync(uri); 
} 
+2

雖然你失去了流媒體功能,不是嗎?總是交易的因素,但! – 2011-01-16 22:48:53