我在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