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 サイト (必ずしも同じドメインからではない) にデータを投稿し、応答を外部ブラウザーにリダイレクトする方法はありますか?
とにかく、あなたのコメントは大歓迎です。