私はSilverlightのEsriマップを持っており、スクリーンショットを取得しようとしています。しかし、「ピクセルにアクセスできません」と言って、writeablebitmapのクロスドメインコンテンツ保護に直面しています。
これを無効にする方法はありますか?またはSilverlight3または4でのその他の回避策はありますか?
私はSilverlightのEsriマップを持っており、スクリーンショットを取得しようとしています。しかし、「ピクセルにアクセスできません」と言って、writeablebitmapのクロスドメインコンテンツ保護に直面しています。
これを無効にする方法はありますか?またはSilverlight3または4でのその他の回避策はありますか?
有効なclientaccesspolicy.xmlを使用してAmazonクラウドフロントサーバーにビデオを保存し、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);
}
画像を再ホストすることで、これを回避することができます。基本的に、マップのプロキシとして機能するwcfサービスをサーバーに設定できます。その後、Silverlightがメディアソースのセキュリティチェックを実行すると、サーバーによって「ホスト」されていることが確認され、レンダリングできるようになります。書き込み可能なビットマップに変換します。ただし、これによりサーバーの負荷が大幅に増加する可能性があります。
この問題を回避する最も簡単な方法は、Silverlightアプリケーションとイメージが同じドメインからホストされていることを確認することです。あなたがこの質問をしているので、私はこれが不可能であると思います。
イメージがホストされているサーバーを制御していますか?その場合は、クライアントアクセスポリシーファイルを追加して、Silverlightアプリからの画像へのクロスドメインアクセスを有効にすることができます。次に、これらの画像の消費方法を変更する必要があります。Image要素のソースを画像のURIに設定する代わりに、WebClientを使用して画像をストリームとしてダウンロードし、Image要素のソースをそのストリームに直接設定します。これを行うと、WriteableBitmapピクセルにアクセスしようとしたときにクロスドメインアクセス違反に遭遇することはありません。
ビットマップのソースが別のドメインである場合、簡単な答えはノーです。この「スクリーンショット」をどのように撮ろうとしているのかわかりませんが、これを停止するのには十分なセキュリティ上の理由があるようです...もちろん、フル(読み取り/書き込み)ピクセルアクセスは通常、画像はローカルドメインにあります。
これを解決する正しい方法は、ユーザーのデスクトップのスクリーンショットを撮りたいと思われる場合、Silverlightアプリに完全な信頼を要求させることです。これはSilverlight 3以降(およびSilverlight 4で拡張)可能です。ただし、これにはOOB(ブラウザーアプリ外)である必要があります。