2011-06-01 1 views
1

J'essaie de voir si je peux définir un cookie pendant l'événement Application_Error() de l'global.asax.Est-il possible de définir des cookies dans Application_error

Lorsque je débogue mon application, il semble que le code ajoute le cookie mais la prochaine fois qu'il se charge, le cookie est parti. C'est recréer le cookie à chaque fois. Je l'ai essayé localement (en utilisant casini) ou un serveur.

Je commence à penser que ce n'est pas possible.

Voici quelques extraits de code.

asax mondiale

protected void Application_Error() 
{ 
    var ex = Server.GetLastError(); 
    Server.ClearError(); 
    string keyName = ex.StackTrace; 
    string[] split = System.Text.RegularExpressions.Regex.Split(ex.StackTrace, "\r\n"); 

// Don't want the key name to be too long but unique enough 
    if (split.Length > 0) 
    { 
     keyName = split[0]; 
    } 

     keyName = keyName.Trim(); 

    HttpCookie exist = Response.Cookies[keyName]; 

    if (exist == null || string.IsNullOrWhiteSpace(exist.Value)) 
    { 
     HttpCookie newCookie = new System.Web.HttpCookie(keyName, "ehllo"); 
     newCookie.Expires = DateTime.Now.AddYears(1); 
     Response.Cookies.Add(newCookie); 

     // email people 
    } 
} 

contrôleur provoquant l'erreur

public ActionResult Index() 
{ 
    int a = 0; 
    int b = 2; 

    try 
    { 
     int hello = (b/a); 
    } 
    catch (Exception e) 
    { 
     throw; 
    } 

    return View(); 
} 

Mise à jour - pour répondre commentaire de Tejs - L'objectif du projet sera de courrier électronique l'erreur (facile à faire). J'essaie de trouver un moyen d'empêcher la boîte aux lettres d'être spammé si l'utilisateur appuie continuellement sur F5 (je pense que les cookies pourraient être une bonne idée).

mise à jour 2 - J'ai changé pour refléter asax mondiale plus proche de ce que je suis en train d'accomplir

+0

Pourquoi voudriez-vous de définir un cookie sur Application_Error? – Tejs

+0

Mis à jour ma question avec mon raisonnement Tejs – Lareau

+0

Si vous voulez empêcher le spam, vous devez mettre en place une sorte de limitation; Habituellement, cela ne fait que marquer l'heure de la dernière erreur, puis ne pas envoyer une autre erreur par courriel jusqu'à ce que la date et l'heure se soient écoulées. – Tejs

Répondre

1

Soupir, il s'est avéré que je ne vérifiais pas mon cookie correctement.

que je faisais

HttpCookie exist = Response.Cookies[keyName]; 

au lieu de

HttpCookie exist = Request.Cookies[keyName]; 
2

Personnellement, j'utiliser un ErrorsContoller pour gérer les erreurs:

public class ErrorsController : Controller 
{ 
    public ActionResult Fault(Exception ex) 
    { 
     var newCookie = new HttpCookie("key", "Exception Exists"); 
     newCookie.Expires = DateTime.Now.AddYears(Dfait.Environment.RemedyCacheDuration); 
     Response.Cookies.Add(newCookie); 

     // You could return a view or something here 
     return Content("OOPS", "text/plain"); 
    } 
} 

et Application_Error:

protected void Application_Error(object sender, EventArgs e) 
{ 
    var app = (HttpApplication)sender; 
    var context = app.Context; 
    var ex = context.Server.GetLastError(); 
    context.Server.ClearError(); 

    var routeData = new RouteData(); 
    routeData.Values["controller"] = "Errors"; 
    routeData.Values["action"] = "Fault"; 
    routeData.Values["exception"] = ex; 
    IController controller = new ErrorsController(); 
    controller.Execute(new RequestContext(new HttpContextWrapper(context), routeData)); 
} 
+0

Salut Darin, merci pour cette autre façon de gérer les erreurs. Nous avons beaucoup d'anciennes applications web, c'est pourquoi je voulais utiliser global.asax mais beaucoup de nos nouvelles applications utilisent mvc donc je vais garder ça dans ma poche. – Lareau

Questions connexes