1

我想知道如何使用 geckoWebBrowser 将数据从 c# 表单发布到 php?我已经在表单上使用 IE 浏览器完成了

    public Form1()
    {
        InitializeComponent();
        String postdata = "data=somedata";

        System.Text.Encoding a = System.Text.Encoding.UTF8;

        byte[] byte1 = a.GetBytes(postdata);

        webBrowser1.Navigate("somepage.php", "", byte1, "Content-Type: application/x-www-form-urlencoded");
    }

但是如何使用 geckoWebBrowser1.Navigate 做到这一点?

4

1 回答 1

0

该方法GeckoWebBrowser.Navigate()将其参数传递给一个nsIWebNavigation实例,该实例是XPCOM运行浏览器实例的接口,在这种情况下使用XULRunner 1.8(它很旧)。

不幸的是, 的Navigate()方法GeckoWebBrowser没有为postData;提供重载。它只是通过Intptr.Zero了那个论点。

我无法测试它,但是如果您在 中创建这样的新方法GeckoWebBrowser.cs,您可以使用包含发布数据的字符串来调用它:

public bool Navigate(string url, string postData, GeckoLoadFlags loadFlags)
{
    if (url == null)
    {
        throw new ArgumentNullException("url");
    }

    if (!IsHandleCreated)
    {
            throw new InvalidOperationException("Cannot call Navigate() before the window handle is created.");
    }

    if (IsBusy)
    {
        this.Stop();
    }

    return WebNav.LoadURI(url, (uint)loadFlags, null, GetStreamFromString(postData), IntPtr.Zero) == 0;
}

public static Stream??? CreateStreamFromString(string input)
{
    return new StreamReader???(input);
}

请注意,该LoadURI方法接受一个nsIInputStream我不知道的参数。尝试找到参数类型以及如何实例化它,并修复CreateStreamFromString()方法以返回和实例化正确的类型。

另请查看参数的文档postData

如果 URI 对应于 HTTP 请求,则此流直接附加到 HTTP 请求标头。它可能带有额外的 HTTP 标头作为前缀。此流必须包含将任何 HTTP 标头与 HTTP 请求正文分开的 \r\n 序列。此参数可能为空。


但是,如果仅用于将数据发布到某个 URL,那么您可能只想使用一个WebClient或(仅限 .NET 4.5)类。HttpClient

于 2012-11-24T16:26:51.823 回答