0

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)]

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

这就是我从siteA和siteB发出请求的方式:

 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";
4

2 回答 2

1

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

于 2012-07-24T15:06:14.637 回答
0

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

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

于 2014-01-08T08:39:10.183 回答