При взаимодействии Silverlight с JavaScript я столкнулся с странным поведением в приложении Silverlight Out-of-Browser (OOB). Моя цель состоит в том, чтобы http-post опубликовать некоторые данные на конкретном сайте. Мы можем отправлять данные с использованием классов WebClient или HTTPWebRequest. Но как перенаправить ответ на внешний веб-браузер? Я думал, что создам динамическую форму HTML с методом post и вызову функцию JavaScript из Silverlight, которая представила бы форму. К сожалению, он только отправляет форму с target = "_ self", а не с target = "_ blank". Код для загрузки генерируется HTML строку в Silverlight в контроле WebBrowser:Параметры Http-post и ответ на отображение в браузере с использованием Silverlight и JavaScript
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». Даже если я нажимаю кнопку «Отправить» с помощью мыши, данные отправления не отправляются, только веб-сайт отображается во внешнем браузере без сообщений. Это связано с механизмом безопасности в Silverlight? Следует также упомянуть, что я отправляю на тот же сайт, на котором опубликовано приложение Silverlight: http://localhost:53222
(ну он еще не опубликован, так как я запускаю его прямо из VisualStudio в режиме OOB). Таким образом, это не должно быть категоризировано как межсайтовый скриптинг, я думаю ...
Есть ли способ опубликовать данные на каком-либо веб-сайте (не обязательно из того же домена) и перенаправить ответ на внешний браузер?
В любом случае, ваши комментарии приветствуются.