2013-05-21 5 views
0

При взаимодействии 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). Таким образом, это не должно быть категоризировано как межсайтовый скриптинг, я думаю ...

Есть ли способ опубликовать данные на каком-либо веб-сайте (не обязательно из того же домена) и перенаправить ответ на внешний браузер?

В любом случае, ваши комментарии приветствуются.

ответ

0

Я придумал обходное решение, которое выполняет именно то, что я хотел (запускает внешний браузер и загружает определенный веб-сайт при размещении на нем некоторых параметров). Вместо того, чтобы использовать 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); 
} 

Please обратите внимание, что для создания/удаления файла ваше приложение SL должно быть доверенным приложением. То есть, он должен иметь повышенные разрешения (проверьте свойство Application.Current.HasElevatedPermissions).

Access local file system in Silverlight 5. В SL 4 можно было использовать COM-совместимость и Scripting.FileSystemObject для доступа к локальной файловой системе.

 Смежные вопросы

  • Нет связанных вопросов^_^