update1: После дополнительных исследований я не уверен, что это возможно, Я создал запись UserVoice при исправлении ошибки.
Я пытаюсь сохранить CookieContainer при выходе из приложения или когда происходит захоронение, но я столкнулся с некоторыми проблемами.
Я пытался сохранить CookieContainer в AppSettings, но при загрузке файлы cookie ушел.
Researching this internally, DataContractSerializer cannot serialize cookies.
This seems to be a behavior that Windows Phone inherited from Silverlight's DataContractSerializer.
После проведения дополнительных исследований выяснилось, что обходной путь заключается в том, чтобы вытащить печенье из контейнера и сохранить его другим способом. Это работало нормально, пока я не наткнулся на другую загвоздку. Я не могу получить файлы cookie с Uri .mydomain.com. Я полагаю, что это из-за этой ошибки. Я вижу файл cookie .mydomain.com в таблице доменов, но GetCookies не работает с этим конкретным файлом cookie.
Ошибка снова опубликована здесь.
Также существует проблема с получением файлов cookie из контейнера, когда домен начинается с .:
CookieContainer container = new CookieContainer();
container.Add(new Cookie("x", "1", "/", ".blah.com"));
CookieCollection cv = container.GetCookies(new Uri("http://blah.com"));
cv = container.GetCookies(new Uri("http://w.blah.com"));
Я нашел обходной путь для этого, используя отражение для итерации доменной таблицы и удаления '.' префикс.
private void BugFix_CookieDomain(CookieContainer cookieContainer)
{
System.Type _ContainerType = typeof(CookieContainer);
var = _ContainerType.InvokeMember("m_domainTable",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.GetField |
System.Reflection.BindingFlags.Instance,
null,
cookieContainer,
new object[] { });
ArrayList keys = new ArrayList(table.Keys);
foreach (string keyObj in keys)
{
string key = (keyObj as string);
if (key[0] == '.')
{
string newKey = key.Remove(0, 1);
table[newKey] = table[keyObj];
}
}
}
Только при вызове InvokeMember в SL генерируется исключение MethodAccessException. На самом деле это не решает мою проблему, поскольку одним из файлов cookie, которые мне нужно сохранить, является HttpOnly, что является одной из причин для CookieContainer.
Если сервер отправляет файлы cookie HTTPOnly, вы должны создать System.Net.CookieContainer для запроса на хранение файлов cookie, хотя вы не увидите файлы cookie, хранящиеся в контейнере, и не сможете получить к ним доступ.
Итак, есть идеи? Я пропустил что-то простое? Есть ли другой способ сохранить состояние CookieContainer или мне нужно сохранить информацию о пользователях, включая пароль, и повторно аутентифицировать их каждый раз при запуске приложения и при возвращении из захоронения?