我试图去一个HTTPS的网站从WebBrowser控件的Web应用程序,从网站上获取一些基本信息(该网站不具备Web服务或在这一点上任何其他API)当我这样做从IIS快递我能够连接登录和切换不同页面,就像我做从网络浏览器对系统的一切,当直接连接工作正常。
大多数开发系统如Windows 10或Windows Server 2016,我可以发布的Web应用程序,连接到Web应用程序,然后通过Web应用程序连接到该网站,登录并加载其他页面的一切工作正常。 但…。 当我部署到GoDaddy的,并通过应用程序连接到网站,我能够成功登录,但是,当我浏览到另一个网页,我重定向到登录页面。
我注意到,我没有回去过上GoDaddy的应用去当任何JSESSION cookies,但我让他们在所有的其他成功案例。 我收到JSESSON饼干我在目标位点登录之前: http://www.altavista.com/但返回的连接饼干应该足够任何网站。 我已经改变了用户代理桌面上我有同样的代理和连接,仍然得到GoDaddy的相同的结果。
我曾尝试在GoDaddy的网站,是受SSL保护的(HTTPS)和那些不只是(HTTP)。 希望有人已经使用WebBrowser控件之前遇到这种类型的问题?
下面的代码的测试片段(正如你可能会注意到我已经尝试了很多东西摸不着头脑CookiePresistance,清除Cookie,JScript的清除状态等:
public static class NativeMethods
{
[DllImport("wininet.dll", SetLastError = true)]
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption,
IntPtr lpBuffer, int lpdwBufferLength);
public static void SuppressCookiePersist()
{
int dwOption = 81; //INTERNET_OPTION_SUPPRESS_BEHAVIOR
int option = 3; // INTERNET_SUPPRESS_COOKIE_PERSIST
IntPtr optionPtr = Marshal.AllocHGlobal(sizeof(int));
Marshal.WriteInt32(optionPtr, option);
bool x = InternetSetOption(IntPtr.Zero, dwOption, optionPtr, sizeof(int));
Marshal.FreeHGlobal(optionPtr);
}
public static void EnableCookiePersist()
{
int dwOption = 81; //INTERNET_OPTION_SUPPRESS_BEHAVIOR
int option = 4; // INTERNET_SUPPRESS_COOKIE_POLICY ignores policy and allows cookies to be set https://msdn.microsoft.com/en-us/library/windows/desktop/aa385328(v=vs.85).aspx
IntPtr optionPtr = Marshal.AllocHGlobal(sizeof(int));
Marshal.WriteInt32(optionPtr, option);
InternetSetOption(IntPtr.Zero, dwOption, optionPtr, sizeof(int));
option = 1;
Marshal.WriteInt32(optionPtr, option);
InternetSetOption(IntPtr.Zero, dwOption, optionPtr, sizeof(int));
Marshal.FreeHGlobal(optionPtr);
}
public static void ClearBrowserSession()
{
int dwOption = 42; //INTERNET_OPTION_END_BROWSER_SESSION
InternetSetOption(IntPtr.Zero, dwOption, IntPtr.Zero, 0);
}
}
public partial class TestStub: System.Web.UI.Page
{
protected void btnNavigate_Click(object sender, EventArgs e)
{
NativeMethods.EnableCookiePersist();
if(tbUrl.Text == "")
{
Client_Alert("Please enter url");
return;
}
if (tbUserAgent.Text == "")
tbUserAgent.Text = CurrentUserAgent;
object o = tbUrl.Text;
var t = new Thread((ParameterizedThreadStart)GetPage);
t.SetApartmentState(ApartmentState.STA);
t.Start(o);
GettingPage = true;
while (GettingPage == true)
Thread.Sleep(500);
t.Join();
return;
}
private void GetPage(object o)
{
StringBuilder SB = new StringBuilder();
DirectorBrowser = new WebBrowser();
NativeMethods.ClearBrowserSession();
DirectorBrowser.ScrollBarsEnabled = false;
DirectorBrowser.ScriptErrorsSuppressed = true;
DirectorBrowser.AllowNavigation = true;
DirectorBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; '); for (e = 0; e < a.length && a[e]; e++) { f++; for (b = '.' + location.host; b; b = b.replace(/^ (?:% 5C.|[^% 5C.] +) /, '')){ for (c = location.pathname; c; c = c.replace(/.$/, '')) { document.cookie = (a[e] + '; domain=' + b + '; path=' + c + '; expires=' + new Date((new Date()).getTime() - 1e11).toGMTString()); } }}})())");
NativeMethods.EnableCookiePersist();
DirectorBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_NoticeCompleted);
Uri url = new Uri((string)o);
DirectorBrowser.Navigate(url, null, null, "User-Agent: " + tbUserAgent.Text);
GettingPage = true;
while (GettingPage == true)
{
System.Windows.Forms.Application.DoEvents();
Thread.Sleep(500);
}
}
private void browser_NoticeCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (GettingPage == true)
{
HtmlElement body = DirectorBrowser.Document.Body;
HtmlElementCollection inputs = DirectorBrowser.Document.GetElementsByTagName("INPUT");
HtmlElementCollection forms = DirectorBrowser.Document.Forms;
body = DirectorBrowser.Document.Body;
string webResults = body.InnerHtml;
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(webResults);
htmlDoc.OptionFixNestedTags = true;
tbMaintenanceResults.Text = "Cookies: <br>" + DirectorBrowser.Document.Cookie + "<br>" + body.InnerHtml;
GettingPage = false;
}
else
{
GettingPage = false;
}
}
}