如何使用WebBrowser控件从发送POST数据中获取响应数据
本文关键字:数据 POST 获取 响应 何使用 WebBrowser 控件 | 更新日期: 2023-09-27 18:28:07
我想知道如何在使用WebBrowser控件的重载"Navigate"方法后获得响应数据。下面是我正在做的一个例子:
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个错误。不过,我希望能够用网络浏览器做到这一点。但如果我做不到,任何帮助都将不胜感激。
您可以使用网络浏览器控件使用虚假的网络点击事件等登录(您似乎已经这样做了,+1)
然后你可以将cookie从网络浏览器控件转移到网络请求,以做更理智的事情。您也可以缓存cookie以备稍后使用
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();
}
}
}
尝试使用System.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/service等)解析和使用响应
希望这能有所帮助。