在HttpModule中创建后,在MVC4中消失Cookie

时间:2012-07-11 15:28:54

标签: asp.net-mvc cookies persistence httpmodule healthvault

我创建了一个模块来处理对Microsoft HealthVault的身份验证。在BeginRequest事件处理程序中,我正在检查authToken,当它收到时,我正在创建一个新的cookie来保存用户的信息,以便稍后在控制器中使用。

我正在丢失cookie但也许我正在寻找错误的地方。

事件处理程序将HttpApplication作为唯一参数,因此我将cookie添加到application.Response.Cookies集合中。问题归结为:HttpApplication的这个实例是单例吗?它与System.Web.HttpContext.Current.ApplicationInstance?

相同

但也许,生命周期中此时设置的cookie后来被删除了。那是我做错了吗?

非常感谢任何帮助。

更新

自从我提出问题以来,我已经改变了一些事情。我现在在HttpModule中处理PreRequestEventHandler。我让HealthVault的WebApplicationUtilities对象进行cookie创建和存储,但概念上没有任何改变。创建cookie或在创建cookie之后首次时,我没有遇到任何问题。

这是我在HttpModule事件处理程序中的cookie创建代码:

static void PreRequestHandlerExecute(Object sender, EventArgs e)
{
    HttpContext ctx = System.Web.HttpContext.Current;
        string authToken = ctx.Request.Params["wctoken"];
        if (!String.IsNullOrEmpty(authToken))
        {
            personInfo = WebApplicationUtilities.GetPersonInfo(authToken);
            WebApplicationUtilities.SavePersonInfoToCookie(ctx, personInfo);

            NameValueCollection query = HttpUtility.ParseQueryString(ctx.Request.Url.Query);
            query.Remove("wctoken");
            query.Remove("suggestedtokenttl");

            UriBuilder newUrl = new UriBuilder(ctx.Request.Url);
            newUrl.Query = query.ToString();
            //app.Response.Redirect(newUrl.Uri.OriginalString);
        }
}

请注意,重定向已被注释。在第一个请求(在auth之后)创建cookie并且我的默认操作然后能够使用LoadPersonInfoFromCookie()读取它。我发现重定向导致cookie不会被发送到客户端。

我还注意到,在后续请求中,Cookie不存在于Request.Cookies集合中,因此当LoadPersonInfoFromCookie()运行时,我最终得到一个null。奇怪的是,我可以在Response对象中看到cookie,但内容为空。

这是动作代码,只是因为......

public HttpContext Context
{
    get { return System.Web.HttpContext.Current; }
}

public ActionResult Dashboard()
    {
        try
        {
            HealthVaultAccountModel model = new HealthVaultAccountModel();
            PersonInfo personInfo = WebApplicationUtilities.LoadPersonInfoFromCookie(Context);
            if (personInfo != null)
                model.PersonName = personInfo.Name;
            return View(model);
        }
        catch (Exception ex)
        {
            return RedirectToAction("Index", "Error");
        }
    }

更新

以下是立即窗口中的cookie。我甚至将Expires时间延长了30天。

在创建后的默认操作中

Context.Request.Cookies["_wcpage"]
{System.Web.HttpCookie}
    Domain: null
    Expires: {8/13/2012 5:24:02 PM}
    HasKeys: true
    HttpOnly: true
    Name: "_wcpage"
    Path: "/"
    Secure: true
    Shareable: false
    Value: "p=1:1234-pVTbctowEP0V..."
    Values: {p=1%3a1234-pVTbctowEP0V...}

在下一个请求的操作中

Context.Request.Cookies["_wcpage"]
null

有趣的是,cookie是在响应对象中定义的,但是值已经消失,过期时间被重置。

Context.Response.Cookies["_wcpage"]
{System.Web.HttpCookie}
    Domain: null
    Expires: {1/1/0001 12:00:00 AM}
    HasKeys: false
    HttpOnly: false
    Name: "_wcpage"
    Path: "/"
    Secure: false
    Shareable: false
    Value: ""
    Values: {}

1 个答案:

答案 0 :(得分:1)

您是如何创建/获取Cookie的? SavePersonInfoToCookie课程中的LoadPersonInfoFromCookieWebApplicationUtilities方法会为您完成。

的BeginRequest:

// given an authToken from the querystring/post values
var personInfo = WebApplicationUtilities.GetPersonInfo(authToken);
WebApplicationUtilities.SavePersonInfoToCookie(application.Context, personInfo);

控制器:

var personInfo = WebApplicationUtilities.LoadPersonInfoFromCookie(HttpContext);