C# 如何使用WebBrowser控件从发送POST数据中获取响应数据?

C# 如何使用WebBrowser控件从发送POST数据中获取响应数据?,c#,browser,response,postdata,C#,Browser,Response,Postdata,我想知道如何在使用WebBrowser控件的重载“导航”方法后获得响应数据。下面是我正在做的一个例子: wb.Navigate("https://live.xbox.com/en-US/Friends/List", "", Encoding.ASCII.GetBytes(post), "Content-Type: application/x-www-form-urlencoded\r\n"); 这是将我的页面导航到第一个参数,但我不知道如何通过调用它来获取响应数据。我想要的结果也是响应的主体。

我想知道如何在使用WebBrowser控件的重载“导航”方法后获得响应数据。下面是我正在做的一个例子:

wb.Navigate("https://live.xbox.com/en-US/Friends/List", "", Encoding.ASCII.GetBytes(post), "Content-Type: application/x-www-form-urlencoded\r\n");
这是将我的页面导航到第一个参数,但我不知道如何通过调用它来获取响应数据。我想要的结果也是响应的主体。
谁能帮帮我吗。我尝试使用WebRequest和WebResponse方式,但由于某些原因,它们不允许我将用户登录到Xbox Live网站,导致我无法执行任何操作,并出现411个错误。我希望能用WebBrowser做到这一点。但如果我不能,任何帮助都将不胜感激

尝试使用系统.Net.HttpWebRequest而不是WebBrowser控件:

try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://website.com/service");
            request.Method = "GET";
            StringBuilder data = new StringBuilder();
            try
            {
                using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    StreamReader reader = new StreamReader(response.GetResponseStream());
                    return reader.ReadToEnd();
                }
            }
            catch (WebException ex)
            {
                WebResponse errorResponse = ex.Response;
                using (Stream responseStream = errorResponse.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
                    String errorText = reader.ReadToEnd();
                }
                throw;
            }
        }
        catch (Exception)
        {
            throw;
        }
这应该是非常自我解释的,但总而言之,代码将使用HTTPGET命令创建对远程web服务器的请求。然后可以从应用程序(控制台/winform/服务等)解析和使用响应


希望这能有所帮助。

您可以使用webbrowser控件使用虚假的web单击事件等进行登录(您似乎已经这样做了,+1)

然后,您可以将cookies从webbrowser控件传输到webrequest,以执行更理智的操作。您还可以缓存cookies以备以后使用

using System;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;

namespace Sample.Helpers {
    public class NativeMethods {
        public static CookieContainer GetUriCookieContainer(Uri uri) {
            CookieContainer cookies = null;
            int datasize = 8192 * 16; // Determine the size of the cookie
            StringBuilder cookieData = new StringBuilder(datasize);
            if (!InternetGetCookieEx(uri.ToString(), null, cookieData, ref datasize, InternetCookieHttponly, IntPtr.Zero)) {
                if (datasize < 0)
                    return null;
                cookieData = new StringBuilder(datasize); // Allocate stringbuilder large enough to hold the cookie
                if (!InternetGetCookieEx(
                    uri.ToString(),
                    null, cookieData,
                    ref datasize,
                    InternetCookieHttponly,
                    IntPtr.Zero))
                    return null;
            }
            if (cookieData.Length > 0) {
                cookies = new CookieContainer();
                cookies.SetCookies(uri, cookieData.ToString().Replace(';', ','));
            }
            return cookies;
        }
        [DllImport("wininet.dll", CharSet = CharSet.Unicode, SetLastError = true, ThrowOnUnmappableChar = true)]
        private static extern bool InternetGetCookieEx(string url, string cookieName, StringBuilder cookieData, ref int size, Int32 dwFlags, IntPtr lpReserved);
        private const Int32 InternetCookieHttponly = 0x2000;

    }
}
var webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.CookieContainer = Cookies;
//webRequest.Headers.Add(HeaderCollection); 
webRequest.Timeout = 10000;
//webRequest.UserAgent = UserAgent;
webRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
webRequest.Method = "POST";
byte[] postBytes;
if (postDataRaw != null) {
    postBytes = Encoding.UTF8.GetBytes(postDataRaw);
}
webRequest.ContentLength = postBytes.Length;
using (var dataStream = webRequest.GetRequestStream()) {
    dataStream.Write(postBytes, 0, postBytes.Length);
}
using (var response = webRequest.GetResponse()) {
    var result = ((HttpWebResponse)response).StatusCode;
    using (var responseStream = response.GetResponseStream()) {
        using (var streamReader = new StreamReader(responseStream)) {
            return streamReader.ReadToEnd();
        }
    }
}