回答

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