最近在尝试做一个简单浏览器,其中需要通过对一个url,post一个json格式的字符串来得到网页。为此,首先尝试了把json格式作为参数与url进行拼接发送,结果却发现得不到我们想要的结果。幸好,vs自带的控件 webBrowser,其中有Navigate(url,… ,post data,…)函数可以直接实现这个功能。可是,没过多久我们就发现,vs自带的 webBrowser是ie内核的,并不支持html5,在后续操作上会出现很大的问题,所以我们不得不寻找谷歌内核的浏览器控件。
通过一番寻找,最后把目标锁定在cefsharp上,发现它可以实现类似于Navigate(url,… ,post data,…)的功能。接下来,就简单的记录下如何解决这一问题。
cefsharp的安装
cefsharp安装,可以直接利用vs联网下载(我是下载cefsharp.winforms.47.0.2.nupkg,查阅很多资料说vs2010不支持较高版本的,所以我用47.0.2,使用中并没有发现什么异常,所以也没有继续深究了),也可以下载离线压缩包,解压到工程debug或者release目录下,直接引用CefSharp.dll,CefSharp.Core.dll,CefSharp.WinForms.dll就可以。
离线包地址:https://download.csdn.net/download/c1149884598/10933630
cefsharp的简单使用
在cefsharp使用中, 不支持anycpu,需要设置成x86或者x64。
ChromiumWebBrowser browser; //定义
this.browser = new ChromiumWebBrowser("http://www.baidu.com"); //初始化
browser.Back(); //后退
browser.Forward(); //向前
browser.Reload(); //刷新
browser.Load("http://www.baidu.com");//加载网页
this.panel1.Controls.Add(browser);//显示网页的容器panel
//注册,与js的交互
browser.RegisterJsObject("callbackObj", new CallbackObjectForJs());
//声明的类
public class CallbackObjectForJs
{
public void showMessage(string msg)
{
MessageBox.Show(msg);
}
}
<script type="text/javascript" language="javascript">
///web html里面的代码
function Button_Click()
{
callbackObj.showMessage("hello");
}
</script>
随后,为了实现post功能,通过查阅大量资料,找到了一段代码,可以进行适当的修改来实现自己的需要。
public void Navigate(this IWebBrowser browser, string url, byte[] postDataBytes, string contentType)
{
IFrame frame = browser.GetBrowser().MainFrame;
IRequest request = frame.CreateRequest();
request.Url = url;
request.Method = "POST";
request.InitializePostData();
var element = request.PostData.CreatePostDataElement();
element.Bytes = postDataBytes;
request.PostData.AddElement(element);
NameValueCollection headers = new NameValueCollection();
headers.Add("Content-Type",contentType);
request.Headers = headers;
frame.LoadRequest(request);
}
此外,如果安装到另外的电脑,发现无法运行程序,可以尝试安装下依赖环境
vcredist_x86.exe.