我试图在我的应用程序背景中加载网页。以下代码显示了我如何加载页面:
request = (HttpWebRequest)WebRequest.Create("http://example.com");
request.CookieContainer = cookieContainer;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
Stream st = response.GetResponseStream();
StreamReader sr = new StreamReader(st);
string responseString = sr.ReadToEnd();
sr.Close();
st.Close();
}
如您所知,服务器会响应HTML代码或某些javascript代码,但javascripts函数会在网页中添加许多代码。所以我必须解释或编译第一个HTTP响应
我试图使用System.Windows.Forms.WebBrowser对象来完全加载网页,但这是一个弱引擎。
所以我尝试使用CEFSharp(Chromium嵌入式浏览器),它很棒并且工作正常,但我遇到了麻烦。以下是我如何使用CEFSharp加载网页:
ChromiumWebBrowser MainBrowser = new ChromiumWebBrowser("http://Example/");
MainBrowser.FrameLoadEnd+=MainBrowser.FrameLoadEnd;
panel1.Controls.Add(MainBrowser);
MainBrowser.LoadHtml(responseString,"http://example.com");
当我在Form1.cs
中使用此代码并将MainBrowser
添加到面板时,它可以正常工作。但是我想在另一个类中使用它,实际上ChromiumWebBrowser
是另一个自定义对象的一部分,而自定义对象在后台工作。此外,10或20个自定义对象可以同时工作。在这种情况下ChromiumWebBrowser
不再起作用了!
第二个问题是线程问题,当我调用此函数时MainBrowser.LoadHtml(responseString,"http://example.com");
它没有返回任何结果,因此我必须使用Semaphore
暂停代码执行并等待此事件的结果:MainBrowser.FrameLoadEnd
所以我希望我的代码是这样的:
request = (HttpWebRequest)WebRequest.Create("http://example.com");
request.CookieContainer = cookieContainer;
string responseString="";
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
Stream st = response.GetResponseStream();
StreamReader sr = new StreamReader(st);
responseString = sr.ReadToEnd();
sr.Close();
st.Close();
}
string FullPageContent = SomeBrowserEngine.LoadHtml(responseString);
//Do stuffs
你能告诉我怎么做吗?你知道其他任何像我想要的网页浏览器引擎吗?
如果我对CEFSharp或其他概念做了任何错误,请告诉我。