Asp.net mvc 在HttpModule中创建后,MVC4中的Cookie将消失

Asp.net mvc 在HttpModule中创建后,MVC4中的Cookie将消失,asp.net-mvc,cookies,persistence,httpmodule,healthvault,Asp.net Mvc,Cookies,Persistence,Httpmodule,Healthvault,我创建了一个模块来处理对Microsoft HealthVault的身份验证。在BeginRequest事件处理程序中,我正在检查authToken,当收到它时,我正在创建一个新的cookie来保存用户信息,以便稍后在控制器中使用 我把饼干弄丢了,但也许我找错地方了 事件处理程序将HttpApplication作为唯一参数,因此我将cookie添加到application.Response.Cookies集合中。问题归结为:这个HttpApplication实例是一个单例吗?它是否与System

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

我把饼干弄丢了,但也许我找错地方了

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

也许,在生命周期的这一点上设置的cookie稍后会被清除。这就是我做错的吗

非常感谢您的帮助

更新

自从我提出这个问题以来,我改变了一些事情。我现在正在HttpModule中处理PreRequestEventHandler。我让HealthVault的WebApplicationUtilities对象来创建和存储cookie,尽管从概念上讲,并没有什么真正的改变。我在创建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);
        }
}
请注意,重定向已被注释。在第一个请求(经过身份验证后)创建cookie,然后我的默认操作可以使用LoadPersonInfo fromCookie()读取它。我发现重定向导致cookie无法发送到客户端

我还注意到,在后续的请求中,Request.Cookies集合中不存在cookie,因此当LoadPersonInfo fromCookie()运行时,我的结果是null。奇怪的是,我可以在响应对象中看到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。我甚至提前了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: {}

您如何创建/获取cookie?
WebApplicationUtilities
类上的
savePersonInfo-ToCookie
loadPersonInfo-FromCookie
方法将为您完成此任务

开始请求:

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

var personInfo = WebApplicationUtilities.LoadPersonInfoFromCookie(HttpContext);

我很好奇你是否真的在MVC应用程序中实现了这一点。我猜你的测试应用程序没有使用
https
。cookie的
Secure
属性意味着它只能通过
https
连接发送/访问。您可以通过将
添加到
web.config
部分来禁用该功能。另外,为了便于将来参考,如果尚未找到空cookie,那么执行
Context.Response.Cookies[“foo”]
实际上会创建一个空cookie。在
响应
对象中测试cookie的唯一方法是迭代它们。为了回答你的问题,是的,我在MVC应用程序中做过。就是这样。我今天下午就想出来了。非常感谢您的帮助!