update1: После дополнительных исследований я не уверен, что это возможно, Я создал запись UserVoice, исправляя ее .
Я пытаюсь сохранить CookieContainer при выходе из приложения или когда происходит Tombstoning, но я столкнулся с некоторыми проблемами.
Я пытался сохранить CookieContainer в AppSettings, но при загрузке файлы cookie исчезли .
Researching this internally, DataContractSerializer cannot serialize cookies.
This seems to be a behavior that Windows Phone inherited from Silverlight's DataContractSerializer.
После дополнительных исследований мне показалось, что нужно было взять печенье из контейнера и сохранить его другим способом. Это работало хорошо, пока я не наткнулся на другую загадку. Я не могу получить GetCookies с 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 или мне нужно сохранить информацию о пользователях, включая пароль, и повторно аутентифицировать их при каждом запуске приложения и при возврате из захоронения?