在使用Silverlight与JavaScript的互操作性时,我在Silverlight浏览器外(OOB)应用程序中遇到了一种奇怪的行为。我的目标是将一些数据发布到特定网站。我们可以使用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”的目标。即使我用鼠标按下“提交”按钮,也不会发送帖子数据,只是在没有帖子数据的外部浏览器中呈现网站。是否归功于Silverlight中的安全机制?我还要提一下,我发布的是Silverlight应用程序发布的同一站点:http://localhost:53222
(因为我在OOB模式下直接从VisualStudio运行它还没有发布)。因此,我不应该将其归类为跨站脚本...
有没有办法将数据发布到某个网站(不一定来自同一个域)并将响应重定向到外部浏览器?
无论如何,非常欢迎你的意见。
答案 0 :(得分:0)
我提出了一种解决方法,它可以完全按照我的要求执行(启动外部浏览器并加载特定网站,同时向其发布一些参数)。而不是使用WebBrowser
控制HTML文件(类似于问题中)与Form和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
属性)。< / p>
Access local file system in Silverlight 5。在SL 4中,可以使用com互操作性和Scripting.FileSystemObject
来访问本地文件系统。