【问题标题】:cookie persistence in ashx callsashx 调用中的 cookie 持久性
【发布时间】:2012-07-12 17:25:19
【问题描述】:

siteA.com 调用 sitecookie.com/cookies.ashx 并为 sitecookie.com 域设置一个 cookie“cookiename”。 相同的浏览器、相同的窗口、新标签页、siteB.com 调用 sitecookie.com/cookies.ashx 并尝试获取相同的 cookie“cookiename”(再次用于 sitecookie.com 域)但为空。

cookies.ashx 实现 IHttpHandler、IReadOnlySessionState 和 conformsTo [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

所以问题是,为什么它是空的,我们可以检索它吗?

这就是我从站点A 和站点B 发出请求的方式:

 WebClient fs = new WebClient();
            var data = fs.DownloadData("http://sitecookie.com/cookies.ashx");
            var tostring = System.Text.Encoding.ASCII.GetString(data);
            return tostring;

这就是我在 cookies.ashx 中读取 cookie 的方式,返回值是一个字符串。

 var cookie = context.Request.Cookies["cookiename"];
            if (cookie != null) return cookie.Value;
            return "false";

这就是我在 cookies.ashx 中编写 cookie 的方式

HttpCookie cookie = new HttpCookie("sso");
            cookie.Value = context.Request.QueryString["token"];
            cookie.Expires = DateTime.Now.AddDays(1);
            context.Response.AppendCookie(cookie);
            return "true";

【问题讨论】:

    标签: asp.net c#-4.0 cookies ashx


    【解决方案1】:

    事实证明这是不可能的,因为每次对http://sitecookie.com/cookies.ashx 的调用都被视为一个新请求,asp.net 将启动一个新的 sessionId。持久化的唯一方法是存储 sessionid 并将其传递给每个后续请求。对我来说,该解决方案不起作用,因为我有很多客户调用该服务,我将无法在这些客户之间传递 sessionid。

    【讨论】:

      【解决方案2】:

      您的答案是正确的,但可以在后续的 .ashx 调用之间检索 cookie。您需要 .ashx 文件在 .ashx 文件代码的开头从文件或数据库记录中“检索”cookie(我通过命名管道与数据库通信以实现此目的),并将它们“存储”到.ashx 文件代码末尾的同一文件或同一数据库记录中。

      不要忘记记录 cookie 的这些基本组成部分:名称、值、域、HttpOnly、安全和路径,并在正确设置这些组成部分的情况下重新生成 cookie,否则将无济于事!但是 - 如果你做得正确,你可以“欺骗”你的远程服务器 - 它可能首先创建 cookie - 当你与它通信(使用 Http?)并传递它时,你的 .ashx 文件代码调用没有区别在 cookie 容器中来回拥有自己的 cookie。祝你好运..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-24
        • 2013-03-06
        • 1970-01-01
        • 2017-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多