0

Silverlight と JavaScript の相互運用を行っているときに、Silverlight Out-of-Browser (OOB) アプリケーションで奇妙な動作に直面しました。私の目標は、特定のサイトにデータを http 投稿することです。WebClient または HTTPWebRequest クラスを使用してデータを投稿できます。しかし、応答を外部 Web ブラウザにリダイレクトするにはどうすればよいでしょうか。post メソッドを使用して動的な HTML フォームを生成し、Silverlight からフォームを送信する JavaScript 関数を呼び出すと考えました。残念ながら、フォームは target="_self" でのみ送信され、target="_blank" では送信されません。生成された html 文字列を Silverlight の WebBrowser コントロールにロードするコード:

WebBrowser wb = parameter as WebBrowser;
if (wb == null)
    return;

wb.NavigateToString(GetHtml());

HTML を生成する簡単なテスト方法:

private string GetHtml ()
{
    StringBuilder sb = new StringBuilder ();
    sb.Append ("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
    sb.Append ("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
    sb.Append ("<head><title></title>");
    sb.Append(
        "<script type=\"text/javascript\">function submitForm(){" +
        "document.forms[0].submit(); window.external.notify(\"Form Submitted!\");}</script>");
    sb.Append("</head>");
    sb.Append ("<body>");
    sb.Append ("<form id=\"mainForm\" name=\"formName1\" action=\"http://localhost:53222/ReceivePost.aspx\" method=\"POST\" target=\"_blank\">");
    sb.Append ("<input type=\"text\" name=\"u\" value=\"username\"/>");
    sb.Append ("<input type=\"password\" name=\"p\" value=\"password\"/>");
    sb.Append ("<input type=\"submit\" value=\"Submit\"/>");
    sb.Append("</form>");
    sb.Append("</body></html>");
    return sb.ToString ();
}

そのような HTML ページを生成します。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <script type="text/javascript">
            function submitForm(){
                document.forms[0].submit();
                window.external.notify("Form Submitted!");
            }
        </script>
    </head>
    <body>
        <form id="mainForm" name="formName1" action="http://localhost:53222/ReceivePost.aspx" method="POST" target="_blank">
            <input type="text" name="u" value="username"/>
            <input type="password" name="p" value="password"/>
            <input type="submit" value="Submit"/>
        </form>
    </body>
</html>

JS 関数を呼び出すコード:

innerWebBrowser.ScriptNotify += (o, args) =>
    {
        MessageBox.Show("JS says: " + args.Value);
    };
innerWebBrowser.InvokeScript ("submitForm");

前述のとおり、このコードはターゲットを「_self」に設定すると正常に機能しますが、ターゲットを「_blank」に設定すると機能しません。マウスで [送信] ボタンを押しても、投稿データは送信されず、投稿データなしで Web サイトだけが外部ブラウザーでレンダリングされます。Silverlight のセキュリティ メカニズムによるものですか? また、Silverlight アプリが公開されているのと同じサイトに投稿していることにも言及しておく必要がありますhttp://localhost:53222(VisualStudio から OOB モードで直接実行しているため、まだ公開されていません)。したがって、クロスサイトスクリプティングとして分類されるべきではないと思います...

一部の Web サイト (必ずしも同じドメインからではない) にデータを投稿し、応答を外部ブラウザーにリダイレクトする方法はありますか?

とにかく、あなたのコメントは大歓迎です。

4

1 に答える 1

0

私が望んでいたことを正確に実行する回避策を思いつきました(外部ブラウザを起動し、いくつかのパラメータを投稿しながら特定のWebサイトをロードします)。WebBrowserコントロールHTMLファイル(質問と同様)を使用する代わりに、フォームとJavaScriptを使用してフォームonLoadイベントを送信します。次に、生成された HTML コンテンツがファイル システムに書き込まれ、後でデフォルトのブラウザで開始されます。

ファイルは同様のコードで作成される場合があります。

using (StreamWriter file = File.CreateText (filePath))
{
    file.WriteLine (GetHtml());
    file.Close ();
}

デフォルトのブラウザは、次のコードのようなもので開くことができます:

using (dynamic shell = AutomationFactory.CreateObject ("WScript.Shell"))
{
    shell.Run (filePath, 7, false);
}

そして、デフォルトのブラウザが起動して実行された後、生成したばかりのファイルを削除できます。

if (File.Exists (filePath))
{
    File.Delete (filePath);
}

ファイルを作成/削除するには、SL アプリケーションが信頼できるアプリケーションである必要があることに注意してください。つまり、権限を昇格する必要があります (Application.Current.HasElevatedPermissionsプロパティを確認してください)。

Silverlight 5 でローカル ファイル システムにアクセスします。SL 4 では、com の相互運用性を使用しScripting.FileSystemObjectて、ローカル ファイル システムにアクセスできました。

于 2013-05-24T08:45:24.523 に答える