从 winforms 应用程序中的 WebBrowser 控件中的 Web 应用程序读取对象

Read object from web application in WebBrowser control in winforms application

我正在创建一个包含 WebBrowser 用户控件的 winforms 应用程序。 WebBrowser 控件导航到 Web 应用程序中请求用户身份验证详细信息的页面。当输入用户名和密码并提交表单时,Web 应用程序发送请求,如果身份验证成功,则填充 applicationValues 对象中的变量。

实例化 applicationValues 对象时,我想将该对象从 WebBrowser 控件中的 Web 应用程序读回我的 Winforms 应用程序并关闭包含 WebBrowser 控件的窗体。

目前,这一直有效(对象在 Web 应用程序中成功创建),直到 applicationValues 对象应该传回 Winforms 应用程序的部分;我卡住了。

这个控件可以做到吗?如果没有,是否还有其他我应该考虑的方法或解决方法?

可以做到,但需要您做一些工作。首先,在 Web 浏览器控件和其中的任何页面之间来回传递数据的最简单方法是通过 window.external 并调用脚本。当然,您必须在用户控件中设置 objectforscripting 属性。

完成后,您可以通过原始类型以两种方式从 javacript 向 .net 自由发送数据。现在特别针对您的对象,可能值得花时间将其序列化为 JSON 字符串,然后通过 window.external 发送,然后反序列化为 .NET 端的对应对象。您也可以使用 System.Web.Script.Serialization 的 JavaScriptSerializer Or of course you could use JSON.net to deserialize

这里的基本思想取自MSDN

private void Form1_Load(object sender, EventArgs e)
{

    webBrowser1.ObjectForScripting = this;

    webBrowser1.DocumentText =
        "<html><head><script>" +
        "function test(message) { alert(message); }" +
        "</script></head><body><button " +
        "onclick=\"window.external.Test('called from script code')\">" +
        "call client code from script code</button>" +
        "</body></html>";
}

public void Test(String message)
{
    MessageBox.Show(message, "client code");
}

private void button1_Click(object sender, EventArgs e)
{
    webBrowser1.Document.InvokeScript("test",
        new String[] { "called from client code" });
}