2

我有一个使用 Windows Server 2003 在 IIS 6 上创建并运行的 HttpModule。我可以将 cookie 发送到浏览器,但我无法在下一个请求时读取它们,cookie 始终为空。

如果我在 IIS 7 上运行这个模块,它工作得很好。IIS 7 目前不是一个选项,因为我们还没有切换,这需要在此之前完成。

另外,我已经尝试过使用 PostAcquireRequestState 挂钩。

    public void Init(HttpApplication httpApp)
    {
        httpApp.BeginRequest += OnBeginRequest;
    }

    public void OnBeginRequest(Object sender, EventArgs e)
    {
        var httpApp = (HttpApplication)sender;
        var context = httpApp.Context;

        const string cookieName = "sId";

        if (!string.IsNullOrEmpty(context.Request.QueryString["cookie"]))
        {
            var ck = new HttpCookie(cookieName)
                            {
                                Value = httpApp.Context.Request.QueryString["cookie"],
                                Expires = DateTime.Now.AddDays(1)
                            };

            httpApp.Response.Cookies.Add(ck);
        }
        else
        {
            var cookie = httpApp.Request.Cookies[cookieName]
        }
    }
4

3 回答 3

3

我遇到了类似的问题,但有不同的解决方案,所以我想我会分享,以防它帮助某人。我也采纳了 zengchun 的建议,使用一些工具来检查请求和响应标头。由于我使用的是 IE,因此 F12 开发工具非常适用。当我看到 cookie 的响应标头时,我注意到设置了安全标志。果然,我已经将代码从生产 SSL 托管站点复制到不使用 SSL 的测试站点,因此 cookie 上的安全标志阻止了代码读取它。我更新了 web.config 以从 httpcookies 节点中删除 requireSSL,我的网站开始工作。:)

于 2012-10-18T18:54:09.307 回答
1

您的代码看起来有效。问题可能出现在客户端如何请求下一页。您可以使用带有 firefox 的 firebug 或 fidder 工具来记录您的客户端请求并查看请求是否发送 Cookd 值到服务器的请求标头。

例如

请求标头:

get /1.aspx
.....
Cookie: sId=123 [if the client has a cookie then it will appear in here.] 

响应标头:

Set-Cookie: sId=123; expires=Fri, 30-Mar-2012 07:20:23 GMT; 
path=/

如果服务器将 cookie 添加到响应中,则响应如下所示。

现在,我猜您的厨师域中的问题或您的 cookie 路径不同。

设置 cookie 的最佳方法是如下代码:

var ck = new HttpCookie(cookieName)
{
   Value = httpApp.Context.Request.QueryString["cookie"],
   Expires = DateTime.Now.AddDays(1),
   Path="/",
   Domain="your domain"
};

祝你好运。

于 2012-03-29T07:26:44.130 回答
0

多亏了正春,我才能够找到问题的根源。事实证明,我无法使用对静态文件的请求来设置 cookie。我为设置 cookie 后重定向到静态文件的初始请求创建了 .aspx 文件。然后,我的 HttpModule 可以在 .aspx 文件中设置后读取 cookie。不知道为什么我需要一个 .aspx 文件来设置 cookie 而不是 HttpModule,但这修复了它。

于 2012-03-29T15:21:13.093 回答