我在Silverlight中有一個Esri地圖,我正在嘗試獲取屏幕截圖。不過,我正在面向writeablebitmap跨域內容保護,稱「像素無法訪問」。如何禁用Silverlight跨域內容保護WriteableBitmap
有沒有辦法讓我禁用?或Silverlight 3或4中的任何其他工作?
我在Silverlight中有一個Esri地圖,我正在嘗試獲取屏幕截圖。不過,我正在面向writeablebitmap跨域內容保護,稱「像素無法訪問」。如何禁用Silverlight跨域內容保護WriteableBitmap
有沒有辦法讓我禁用?或Silverlight 3或4中的任何其他工作?
你可以通過rehosting圖像來解決這個問題。基本上你可以在你的服務器上設置一個wcf服務,作爲地圖的代理,然後當silverlight對你的媒體源進行安全檢查時,它會發現它是由你的服務器「託管」的,那麼它應該讓你渲染它寫入一個可寫位圖。儘管這可能會顯着增加服務器的負載。
如果位圖的來源是另一個域,那麼簡單的答案是否定的。我不確定你是如何嘗試拍攝這個「屏幕截圖」的,但是聽起來好像有很好的安全原因來阻止這一點......當然,完全(讀/寫)像素訪問通常是可用的,當你圖像在本地域中。
解決這個問題的正確方法就是讓Silverlight應用程序需要完全信任,這是自Silverlight 3(並在Silverlight 4中擴展)之後可能實現的。但是,這確實需要它是一個OOB(瀏覽器應用程序),我相信。
解決此問題最簡單的方法是確保Silverlight應用程序和圖像託管在同一個域中。既然你問這個問題,我會認爲這是不可能的。
您是否控制託管映像的服務器?如果是這樣,您可以添加一個客戶端訪問策略文件,以啓用跨Silverlight應用程序對圖像的跨域訪問。然後你需要改變你如何使用這些圖像。使用WebClient將圖像下載爲Stream並將Image元素的源直接設置爲該Stream,而不是將Image元素的Source設置爲圖像的URI。如果您這樣做,則在嘗試訪問WriteableBitmap像素時不會遇到跨域訪問衝突。
我使用有效的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);
}
雖然你失去了流媒體功能,不是嗎?總是交易的因素,但! – 2011-01-16 22:48:53
+1用於提供替代方案。這是Silverlight的一項安全功能,所以顯然你不能只是'解決'它。 – 2010-06-15 02:48:05