update1:经过更多研究,我不确定这是否可行,我在修复它时创建了一个 UserVoice 条目。
我正在尝试在应用程序退出或发生墓碑时保存 CookieContainer,但我遇到了一些问题。
我试图将 CookieContainer 保存在 AppSettings 中,但加载后,cookies 消失了。
Researching this internally, DataContractSerializer cannot serialize cookies.
This seems to be a behavior that Windows Phone inherited from Silverlight's DataContractSerializer.
在做了更多研究之后,似乎解决办法是从容器中取出饼干并以另一种方式保存它们。这工作得很好,直到我遇到另一个障碍。我无法使用 .mydomain.com 的 Uri 获取 Cookie。我相信这是因为这个错误。我可以在域表中看到 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 的原因之一。
如果服务器发送 HTTPOnly cookie,您应该在请求上创建一个 System.Net.CookieContainer 来保存 cookie,尽管您将看不到或无法访问存储在容器中的 cookie。
那么,有什么想法吗?我错过了一些简单的东西吗?是否有另一种方法来保存 CookieContainer 的状态,或者我是否需要保存用户信息,包括密码,并在每次应用程序启动和从墓碑恢复时重新验证他们的身份?