Добавить cookie в WebBrowser внутри настраиваемого элемента управления

Я пытаюсь HttpWebRequest cookie сеанса между моим HttpWebRequest и HttpWebRequest управления WebBrowser. Он работал нормально, пока я не переместил WebBrowser в пользовательский элемент управления.

Когда я пытаюсь добавить файл cookie, он не устанавливается. Я подтвердил значение cookie, которое я отправляю, он просто не добавляет строку cookie браузера.

Cookie генерируется:

// cookieJar used for the previous HttpWebRequest
CookieCollection cc = cookieJar.GetCookies(the_url);

StringBuilder sb = new StringBuilder();
foreach (Cookie cook in cc)
{
 sb.Append(cook.ToString() + ";");
}
// Confirmed cookie value below is correct: "PHPSESSID=21....";
return sb.ToString();

Cookie отправляется в пользовательский контроль:

// bc is my custom BrowserControl()
bc.add_cookie(c); // Fails in here

Cookie добавляется в WebBrowser (не работает):

// Custom control method
public void add_cookie(string c)
{
 // I check both values here - all looks correct
 browser.Document.Cookie = c;
 // I check both values again here - nothing has changed
}

Значение cookie браузера (до и после - без изменений):

// google analytics cookie (I believe)
__utma=323...; __utmb=235235...; __utmz=25235.236523.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=42346346

Имейте в виду, что этот код работал до того, как я переместил WebBrowser на пользовательский элемент управления. Если нет решения, я могу отменить изменения, но я стараюсь избегать этого.

Короче: почему не добавляется печенье в WebBrowser только тогда, когда он находится внутри настраиваемого элемента управления?

1 ответ

Cookies - это еще не все, есть кеш аутентификации сеанса, который вы не можете копировать. WebBrowser использует UrlMon библиотеку, так что правильный способ сделать это было бы использовать другой UrlMon API, как URLOpenStream, URLDownloadToFile или URLDownloadToCacheFile.

Этот подход позволяет загружать любой ресурс в тот же сеанс с помощью WebBrowser управления WebBrowser. API-интерфейсы UrlMon можно вызывать из С# через P/invoke, вот ответ. Также можно загружать данные в один и тот же сеанс.

licensed under cc by-sa 3.0 with attribution.