2010-11-19 18 views
1

J'ai un problème de cookie dans l'exemple ci-dessous. le cookie est créé et quand je mets un point de débogage après sa création je peux vérifier ce qui est dans le cookie avec une montre. cependant, quand je redémarre le site Web, le cookie est toujours là, mais est devenu vide et ne créera pas le modèle (tous les champs vides sont null.)bizarre problème de cookies MVC2

J'ai regardé autour et ai trouvé des bogues relatifs à l'aide de response.Cookie et ayant pas de date d'expiration, mais j'ai changé les choses et ça reste vide. Est-ce que je fais quelque chose de mal ou est-ce parce que j'utilise localhost im?

[HttpGet] 
    [Autorize] 
    public ActionResult ManagePaymentRun() 
    { 
      ViewData["currentAction"] = "Index"; 
      payments.AccountNo = Request.Cookies["FSCSPayments"]["AccountNo"]; 
      payments.SortCode = Request.Cookies["FSCSPayments"]["SortCode"]; 
      payments.FirstChequeNo = "2";// Request.Cookies["FSCSPayments"]["FirstChequeNo"]; 
      payments.FileName = Request.Cookies["FSCSPayments"]["FileName"]; 
      payments.FRN = Request.Cookies["FSCSPayments"]["FRN"]; 
      payments.JobNumber = Request.Cookies["FSCSPayments"]["JobNumber"]; 
      payments.StartRecNo = Request.Cookies["FSCSPayments"]["StartRecNo"]; 
      return View(payments); 
    } 

    internal void CreateCookie() 
    { 

     HttpCookie cookie = new HttpCookie("FSCSPayments"); 
     cookie.Values.Add("AccountNo", payments.AccountNo); 
     cookie.Values.Add("SortCode", payments.SortCode); 
     cookie.Values.Add("FirstChequeNo", payments.FirstChequeNo); 
     cookie.Values.Add("FileName", payments.FileName); 
     cookie.Values.Add("FRN", payments.FRN); 
     cookie.Values.Add("JobNumber", payments.JobNumber); 
     cookie.Values.Add("StartRecNo", payments.StartRecNo); 
     cookie.Expires = DateTime.Now.AddDays(14); 
     cookie.Path = "/"; 
     Request.Cookies.Add(cookie); 
    } 
+1

Si une date d'expiration future n'est pas définie pour le cookie, il s'agit alors d'un cookie de niveau session et sera généralement détruit lorsque le navigateur se ferme ou que la session expire (en fonction du navigateur). Où dans votre code appelez-vous 'CreateCookie()'? Quand vous dites que vous redémarrez le site Web et que le cookie est là, que voulez-vous dire? Vous le trouvez dans le cache des cookies du navigateur? Si le cookie est persistant, il est indépendant des arrêts et des démarrages du serveur. –

+0

Si je recherche le cache de cookies, il est là. J'ai ajouté un jour d'ajout à mon cookie, donc ce ne devrait pas être un cookie de session, n'est-ce pas? et le createcookie est appelé dans l'action ManagePaymentRun HttpPost, et j'ai mis un point de débogage dans cookie de création et il passe là. – Andy

Répondre

0

Ce problème est résolu et est dû au fait que je l'ai utilisé IIS 5 et MVC. Nous avons copié ce projet sur un PC IIS7 maintenant et nous avons eu les cookies fonctionnant.

0

Je pense que vous devriez trobleshoot le problème, j'ai 3 suggestions:

1) cookie.Expires = DateTime.Now.AddDays (14);

2) faire attention à la .Add (clé, valeur), les valeurs doivent être en sécurité contiennent pas des symboles, althoug Je pense qu'une exception est levée

3) préciser le cookie.path

mais mon pari est le premier.

+0

Oui, je suis d'accord avec votre premier point. OP appelle cookie.Expires.AddDays (14); mais n'attribue pas cette valeur à cookie.Expires. Je devine que cookie.Expires peut même initialiser à DateTime.MinValue aussi. –

+0

J'ai essayé 1 et 3. dans mon cas de test, j'ajoute 16 à tous les champs, donc il n'y aura pas d'éléments étranges là-bas. Cependant, lors de l'ajout du chemin, je ne trouve pas le cookie à ce chemin. – Andy

1
cookie.Path = "C:\\Documents and Settings\\Andy\\Cookies"; 

Ceci n'est pas destiné à faire ce que vous pensez qu'il fait. Vous ne pouvez pas spécifier où le cookie sera stocké sur l'ordinateur client. Cela dépend absolument du navigateur et vous n'avez aucun contrôle sur celui-ci. C'est pour restreindre l'accès de ce cookie à certaines parties de votre site. Donc, si vous ne voulez pas de restriction, réglez-le simplement sur cookie.Path = "/".

Votre méthode d'action ManagePaymentRun semble également étrange. Pourquoi vérifier si l'utilisateur est authentifié quand il est l'attribut [Autorize]:

[HttpGet] 
[Authorize] 
public ActionResult ManagePaymentRun() 
{ 
    ViewData["currentAction"] = "Index"; 
    var payments = new Payments(); 
    payments.AccountNo = Request.Cookies["FSCSPayments"]["AccountNo"]; 
    payments.SortCode = Request.Cookies["FSCSPayments"]["SortCode"]; 
    payments.FirstChequeNo = "2";// Request.Cookies["FSCSPayments"]["FirstChequeNo"]; 
    payments.FileName = Request.Cookies["FSCSPayments"]["FileName"]; 
    payments.FRN = Request.Cookies["FSCSPayments"]["FRN"]; 
    payments.JobNumber = Request.Cookies["FSCSPayments"]["JobNumber"]; 
    payments.StartRecNo = Request.Cookies["FSCSPayments"]["StartRecNo"]; 
    return View(payments); 
} 
+0

Je n'ai jamais entendu parler de l'attribut Authorize mais je l'ai ajouté maintenant. c'est bien. – Andy