Веб-браузер Windows Phone устанавливает файлы cookie

Я использую HttpWebRequest для служб REST, которые используют некоторую базовую аутентификацию, основанную на файле cookie JSESSIONID. Мне нужно передать этот файл cookie элементу управления WebBrowser для повторного использования этого сеанса, но я не нашел подходящего решения, которое позволило бы мне передать этот файл cookie в хранилище файлов cookie браузера.

Там в любом случае? Единственный способ, который я могу сейчас придумать, - это использовать Naviagate(url, null, MANUALLY_CONSTRUCTED_HEADER), что является своего рода грубой силой.

Да и действительно придется использовать WebBrowser для такого рода действий.

Какие-либо предложения?


person Martin Macak    schedule 08.11.2012    source источник
comment
Я попытался поместить Cookie в заголовок, но WebBrowser проигнорировал только этот заголовок. Это была моя последняя надежда, и теперь она разбита. Что теперь?   -  person Martin Macak    schedule 08.11.2012
comment
[DllImport(wininet.dll, CharSet = CharSet.Auto, SetLastError = true)] static extern bool InternetSetCookie(string lpszUrl, string lpszCookieName, string lpszCookieData); не работает на WindowsPhone.   -  person Martin Macak    schedule 08.11.2012
comment
Я думаю, что этого нельзя делать. Windows Phone в этом смысле бесполезен. Потерпеть неудачу.   -  person Martin Macak    schedule 08.11.2012


Ответы (3)


Другая мысль заключается в том, что вы можете добавлять файлы cookie через JavaScript. Вы должны быть в состоянии сделать это (при условии, что IsScriptEnabled имеет значение true в вашем браузере):

private void setCookie(string name, string value, string path = "", string domain = "", bool isSecure=false, string expires = "")
{
        var sb = new StringBuilder();
        sb.AppendFormat("document.cookie = '{0}=\" + escape(\"{1}\")", name, value);
        if (!String.IsNullOrEmpty(expires))
            sb.AppendFormat(";expires=\"{0}\"", expires); // should be a GMTString
        if (!String.IsNullOrEmpty(path))
            sb.AppendFormat(";path=\"{0}\"", path); 
        if (!String.IsNullOrEmpty(domain))
            sb.AppendFormat(";domain=\"{0}\"", domain);
        if (isSecure)
            sb.Append(";secure'");
        var cookieJs = sb.ToString();
        Debug.WriteLine(cookieJs);
        webBrowser.InvokeScript(cookieJs);
}
person DevTheo    schedule 13.11.2012
comment
Да, это была еще одна концепция, которую я уже пробовал. Кажется, это работает, но я был вынужден отказаться от него, потому что вы не можете вызывать javascript, когда браузер выполняет навигацию (что было в моем случае), и я не смог правильно определить момент завершения навигации (когда вы отменяете навигацию, событие Navigated не уволен). - person Martin Macak; 14.11.2012
comment
iam получаю сообщение об ошибке Произошла неизвестная ошибка. Ошибка: 80020006. При попытке использовать этот код в навигационном событии элемента управления Webbrowser - person achukrishnan; 18.06.2013
comment
@achukrishnan Не уверен, где я это сделал, когда пробовал свой код, куда я поместил файл cookie, но событие OnNavigated означает, что вы уже попали на страницу. Возможно, вы захотите попробовать навигацию или какую-то другую точку в вашем коде. - person DevTheo; 06.07.2013
comment
Будьте здоровы. Это должно быть вызвано в событии LoadCompleted WebBrowser. - person Victor Ionescu; 23.06.2014

Я решил свою проблему, впервые отправив JSESSIONID в URL-адрес, который затем получил действительный файл cookie JSESSIONID. Но это не универсальный подход.

Я думаю, что есть решение, которое будет переходить на простую веб-страницу, вложенную в ресурс приложения. Затем браузер может вызвать функцию javascript, которая установит файлы cookie, переданные параметрами. Если Microsoft не будет препятствовать такому подходу (отключив ссылку document.cookie), это может быть решением (еще не проверял).

person Martin Macak    schedule 08.11.2012
comment
это единственное рабочее решение, которое я тоже знаю. Но для этого требуется настройка на стороне сервера. Я надеюсь, что Microsoft будет поддерживать файлы cookie в приложениях и лучше управлять браузером в API wp 8.1. Это функциональность, необходимая во многих бизнес-кейсах. - person dixus; 17.12.2013

Для тех, кто получает исключение при вызове скрипта даже в событии LoadCompleted, попробуйте следующее:

webBrowser.InvokeScript("eval", "document.cookie = \"COOKIE_NAME=" + COOKIE_VALUE + "; Path=/; Domain=" + WEB_URL.DnsSafeHost + " ;\";");

Это сработало для меня в событии LoadCompleted. Имейте в виду, что вам нужно выполнить загрузку дважды, чтобы файлы cookie работали. При LoadCompleted cookie будет введен, но не показан, однако при второй загрузке он будет работать нормально.

person Muhammad Hassan    schedule 16.09.2015