update1:さらに調査した結果、これが可能かどうかはわかりませんが、修正時にUserVoiceエントリを作成しました。
アプリの終了時またはトゥームストーニングが発生したときにCookieContainerを保存しようとしていますが、いくつかの問題が発生しました。
AppSettingsにCookieContainerを保存しようとしましたが、読み込まれるとCookieが失われます。
Researching this internally, DataContractSerializer cannot serialize cookies.
This seems to be a behavior that Windows Phone inherited from Silverlight's DataContractSerializer.
さらに調査を行った後、回避策はコンテナからCookieを取得し、別の方法で保存することであるように思われました。私が別の障害にぶつかるまで、それはうまくいきました。.mydomain.comのURIでGetCookiesを取得できません。私はそれがこのバグのせいであると信じています。ドメインテーブルに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の1つがHttpOnlyであるため、これは実際には私の問題を解決しません。これがCookieContainerの理由の1つです。
サーバーがHTTPOnlyCookieを送信する場合は、Cookieを保持する要求に対してSystem.Net.CookieContainerを作成する必要がありますが、コンテナーに格納されているCookieは表示されないか、アクセスできません。
それで、何かアイデアはありますか?私は何か簡単なものが欠けていますか?CookieContainerの状態を保存する別の方法はありますか、それともパスワードを含むユーザー情報を保存して、アプリが起動するたびに、そして墓石から戻ったときにユーザーを再認証する必要がありますか?