使用Silverlight和JavaScript在浏览器中显示Http-post参数和显示响应

时间:2013-05-21 07:08:13

标签: silverlight http-post silverlight-5.0 silverlight-oob

在使用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运行它还没有发布)。因此,我不应该将其归类为跨站脚本...

有没有办法将数据发布到某个网站(不一定来自同一个域)并将响应重定向到外部浏览器?

无论如何,非常欢迎你的意见。

1 个答案:

答案 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来访问本地文件系统。