如何禁用WriteableBitmap的silverlight跨域内容保护

我在Silverlight中有一张Esri地图,我正在尝试获取屏幕截图。 但是,我正面临着对writeablebitmap的跨域内容保护,称“像素无法访问”。

有没有办法可以禁用它? 还是银光3或4中的任何其他工作?

你可以通过重新托管图像来解决这个问题。 基本上你可以在你的服务器上设置一个wcf服务作为地图的代理,然后当silverlight对你的媒体源进行安全检查时,它会看到它被你的服务器“托管”,那么它应该让你渲染它是一个可写的位图。 虽然这显然会大大增加服务器的负载。

我有一个存储在亚马逊云端服务器上的video,其中包含有效的clientaccesspolicy.xml,允许对silverlight主机URL进行跨域访问,以下function不允许我拍摄video的屏幕截图并操纵像素,直到它被替换为而是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); } 

解决此问题的最简单方法是确保Silverlight应用程序和映像是从同一个域托管的。 既然你在问这个问题,我会认为这是不可能的。

您是否控制托管图像的服务器? 如果是这样,您可以添加客户端访问策略文件,以启用对Silverlight应用程序中的图像的跨域访问。 然后,您需要更改使用这些图像的方式。 不要将Image元素的Source设置为图像的URI,而是使用WebClient将图像作为Stream下载,并将Image元素的源直接设置为该Stream。 如果执行此操作,则在尝试访问WriteableBitmap像素时不会遇到跨域访问冲突。

如果位图的来源是另一个域,那么简单的答案就是否定。 我不确定你是如何尝试拍摄这个“屏幕截图”的,但听起来有很好的安全理由来阻止它…当然,完全(读/写)像素访问通常是可用的,当你的图像位于本地域中。

解决这个问题的正确方法,因为您似乎想要获取用户桌面的屏幕截图,这将使Silverlight应用程序需要完全信任,这可能是Silverlight 3(并在Silverlight 4中扩展)。 但是,我认为这需要它是一个OOB(浏览器应用程序之外)。