2009-10-12 6 views
2

J'ai créé un ActionFilter pour héberger un enregistreur de hits de page sur mon site MVC et j'ai besoin de sauvegarder certaines valeurs dans un cookie. Je l'ai utilisé le code suivant pour écrire le cookie:.NET MVC Write Cookie from ActionFilter

public class LogRequestAttribute : ActionFilterAttribute, IActionFilter 
{ 
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if(filterContext.HttpContext.Request.UserHostAddress != "127.0.0.1") 
      ThreadPool.QueueUserWorkItem(delegate 
      { 
       string adid = filterContext.HttpContext.Request.QueryString["adid"] != null 
        ? (string)filterContext.HttpContext.Request.QueryString["adid"] : string.Empty; 

       if (!String.IsNullOrEmpty(adid)) 
       { 
        HttpCookie cookie = new HttpCookie("adid", adid); 
        cookie.Expires = DateTime.Now.AddDays(30); 
        filterContext.HttpContext.Response.Cookies.Add(cookie); 
       } 

       DomainModel.Concrete.SqlPageHitActivity logger 
        = new DomainModel.Concrete.SqlPageHitActivity(
         System.Configuration.ConfigurationManager.ConnectionStrings["TrackingConnectionString"].ConnectionString); 

       DomainModel.Entities.PageHitActivity hit = new DomainModel.Entities.PageHitActivity 
       { 
        AdIdentifier = filterContext.HttpContext.Response.Cookies["adid"].Value == null ? string.Empty : filterContext.HttpContext.Response.Cookies["adid"].Value, 
        Authenticated = filterContext.HttpContext.Request.IsAuthenticated, 
        Browser = filterContext.HttpContext.Request.UserAgent, 
        CookieId = string.Empty, 
        Parameters = string.Empty, 
        Referer = filterContext.HttpContext.Request.UrlReferrer == null ? string.Empty : filterContext.HttpContext.Request.UrlReferrer.ToString(), 
        RequestDate = DateTime.Now, 
        RequestorIP = filterContext.HttpContext.Request.UserHostAddress, 
        SessionId = string.Empty, 
        SiteId = 1, 
        Target = filterContext.HttpContext.Request.Url != null ? filterContext.HttpContext.Request.Url.AbsoluteUri : string.Empty, 
        UserId = filterContext.HttpContext.Request.IsAuthenticated ? filterContext.HttpContext.User.Identity.Name : string.Empty 
       }; 
       logger.LogHit(hit); 
      }); 
    } 
} 

Le cookie semble apparaître dans la collection, mais ne sont pas disponibles quand un coup de page suivante est connecté.

Merci, Chris

Répondre

7

Essayez d'ajouter un nouveau cookie au lieu de modifier la collection existante:

HttpCookie cookie = new HttpCookie("adid", MyValue); 
cookie.Expires = DateTime.Now.AddDays(30); 

filterContext.HttpContext.Response.Cookies.Add(cookie); 
+0

Bonne idée mais ça n'a pas marché. J'ai ajouté la méthode entière à mon poste ci-dessus. – user135498

+0

Exécutez Fiddler et vérifiez si l'en-tête Cookies est défini dans la réponse –

1

Avez-vous mis l'expiration du cookie? L'expiration de cookie par défaut est un cookie de session (supprime lorsque le navigateur est fermé). Pour enregistrer le cookie sur le disque, vous devez lui donner une date future.

+0

Oui, l'expiration est fixée à 30 jours dans l'avenir. – user135498