2013-05-21 3 views
0

Lors de l'interopérabilité de Silverlight avec JavaScript, j'ai rencontré un comportement étrange dans mon application Silverlight Out-of-Browser (OOB). Mon but est de publier des données http sur le site spécifique. Nous pouvons publier des données en utilisant des classes WebClient ou HTTPWebRequest. Mais alors comment rediriger la réponse à un navigateur Web externe? Je pensais générer un formulaire HTML dynamique avec post-méthode et invoquer une fonction JavaScript de Silverlight qui enverrait le formulaire. Malheureusement, il ne soumet le formulaire qu'avec target = "_ self" et non avec target = "_ blank". code pour le chargement généré chaîne HTML dans le contrôle WebBrowser de Silverlight:Paramètres Http-post et réponse d'affichage dans un navigateur utilisant Silverlight et JavaScript

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

wb.NavigateToString(GetHtml()); 

méthode de test simple pour générer 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(); 
} 

qui génère cette page 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> 

Et le code invoquant la fonction JS:

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

Comme je l'ai dit, ce code fonctionne très bien avec la cible définie sur "_self" mais ne fonctionne pas avec la cible définie sur "_blank". Même si j'appuie sur le bouton Soumettre avec une souris, les données de publication ne sont pas envoyées, juste le site Web est rendu dans un navigateur externe sans données de publication. Est-ce dû au mécanisme de sécurité de Silverlight? Je devrais également mentionner que je poste sur le même site où l'application Silverlight est publiée: http://localhost:53222 (bien qu'il ne soit pas encore publié car je l'exécute directement depuis VisualStudio en mode OOB). Donc il ne devrait pas être classé comme script inter-site je suppose ...

Y at-il un moyen de publier des données sur un site Web (pas nécessairement du même domaine) et de rediriger la réponse à un navigateur externe?

De toute façon, vos commentaires sont les bienvenus.

Répondre

0

Je suis venu avec une solution de contournement qui exécute exactement ce que je voulais (démarre le navigateur externe et charge le site Web spécifique tout en affichant des paramètres). Au lieu d'utiliser WebBrowser fichier HTML de contrôle (similaire à la question) avec formulaire et un JavaScript pour soumettre le formulaire onLoad événement est généré. Ensuite, le contenu HTML généré est écrit dans le système de fichiers et démarré avec le navigateur par défaut plus tard.

Le fichier peut être créé avec un code similaire:

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

navigateur par défaut peut être ouvert avec quelque chose comme le code suivant:

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

Et après que le navigateur par défaut est en cours d'exécution, nous pouvons supprimer le fichier que nous venons de création:

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

S'il vous plaît Notez que pour créer/supprimer un fichier, votre application SL doit être une application de confiance. Autrement dit, il doit avoir des autorisations élevées (vérifiez la propriété Application.Current.HasElevatedPermissions).

Access local file system in Silverlight 5. Dans SL 4, on pourrait utiliser l'interopérabilité com et Scripting.FileSystemObject pour accéder au système de fichiers local.

Questions connexes