无法使 XBAP cookie 工作

Cannot make XBAP cookies work

我正在尝试使 XBAP 应用程序通过登录与 Web 服务进行通信。 但我希望用户在过去 7 天内登录过时跳过登录步骤。 我使用 html/aspx 让它工作。 但是它在 XBAP 中不断失败。

调试时,应用程序获得完全信任。

这是我目前编写 cookie 的代码:

    protected static void WriteToCookie(
        string pName,
        Dictionary<string, string> pData,
        int pExiresInDays)
    {
        // Set the cookie value.
        string data = "";
        foreach (string key in pData.Keys)
        {
            data += String.Format("{0}={1};", key, pData[key]);
        }
        string expires = "expires=" + DateTime.Now.AddDays(pExiresInDays).ToUniversalTime().ToString("r");
        data += expires;

        try
        {
            Application.SetCookie(new Uri(pName), data);
        }
        catch (Exception ex)
        {
        }
    }

这就是我必须阅读的 cookie:

    protected static Dictionary<string, string> ReadFromCookie(
        string pName)
    {
        Dictionary<string, string> data = new Dictionary<string, string>();
        try
        {
            string myCookie = Application.GetCookie(new Uri(pName));

            // Returns the cookie information.
            if (String.IsNullOrEmpty(myCookie) == false)
            {
                string[] splitted = myCookie.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                string[] sub;
                foreach(string split in splitted)
                {
                    sub = split.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                    if (sub[0] == "expires")
                    {
                        continue;
                    }
                    data.Add(sub[0], sub[1]);
                }
            }
        }
        catch(Exception ex)
        {

        }
        return data;
    }

pName 设置为:

string uri = "http://MyWebSiteName.com";

当用户第一次验证时,我调用WriteToCookie 函数并将其设置为7 天过期。 看起来一切都很好,因为我没有收到任何错误消息。 (我在捕获中有一个断点)

之后,我关闭会话并重新启动它。 我做的第一件事是 ReadFromCookie。 然后我收到以下消息的异常:没有更多数据可用 所以我的应用程序自动将用户发送回登录屏幕。

我还尝试在同一会话中的 WriteToCookie 之后立即执行 ReadFromCookie,但我得到了同样的错误。

Application.SetCookie(new Uri("http://MyWebSiteName.com/WpfBrowserApplication1.xbap"), "Hellllo");
string myCookie2 = Application.GetCookie(new Uri("http://MyWebSiteName.com/WpfBrowserApplication1.xbap"));

在我看来,cookie 根本就没有写。 所以我猜我做错了什么。 也许我使用的 uri 是错误的。是否需要特定格式? 就像您需要一个非常具体的到期日期格式一样。

我一直在大量互联网上搜索关于在 XBAP 中使用 cookie 的sample/tutorial,但我找不到任何真正有据可查或经过测试的内容。 很多人说它有效,但没有真正的样本可以尝试。 很多人也是在html里面处理认证,成功reading/writingcookies之后再去XBAP。 如果可能的话,我更喜欢完整的 XBAP 解决方案。

为了在提问之前回答一些问题,这里是项目设置:

我还创建了一个证书,并将其添加到 "publisher cannot be verified" message displayed 中解释的 3 个商店 所以我不再有警告弹出窗口。我只是想确定这不是权限问题。

终于找到了这个问题的答案。

感谢 CodeProject 我终于能够 write/read 来自 XBAP 代码的 cookie。 正如我所猜测的那样,URI 需要非常具体,您不能在其中传递您想要的所有内容。

这个技巧用的是什么:BrowserInteropHelper.Source

最终 read/write 代码如下所示:

Application.SetCookie(BrowserInteropHelper.Source, data);

string myCookie = Application.GetCookie(BrowserInteropHelper.Source);

您似乎不能使用“;”分离你自己的数据。 如果这样做,您将只会获得数据中的第一个条目。 使用不同的分隔符(例如:':'),然后您可以取回所有内容 数据如下所示:

n=something:k=somethingElse;expires=Tue, 12 May 2015 14:18:56 GMT ;

我唯一没有从 Application.GetCookie 那里得到的是过期日期。 不确定这是否正常。也许由于某种原因它被自动冲洗掉了。如果有人知道为什么,我将不胜感激评论以启发我。

至少现在我可以 read/write 数据到 XBAP 中的 cookie。是啊!