2011-06-01 14 views
1

我想了解在global.asax的Application_Error()事件期间是否可以设置cookie。是否有可能在Application_error中设置Cookie

当我调试我的应用程序时,它看起来像代码添加了cookie,但下次加载时,cookie不见了。它每次都重新创建cookie。 我在本地尝试过(使用casini)或服务器。

我开始认为这是不可能的。

这是一些代码片段。

全球ASAX

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 
    } 
} 

控制器导致错误

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

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

    return View(); 
} 

更新 - 回答TEJS的评论 - 该项目的目标是通过电子邮件发送的错误(容易做到)。我试图找出一种方法来防止邮箱得到垃圾邮件,如果用户不断按F5(我虽然饼干可能是一个好主意)。

更新2 - 我已经改变了我的全球ASAX以反映更接近我想要完成

+0

为什么你想设置的Application_Error饼干吗? – Tejs 2011-06-01 15:49:19

+0

更新我的问题与我的推理Tejs – Lareau 2011-06-01 17:21:50

+0

如果你想防止垃圾邮件,你需要实施某种节流;通常这只是标记最后一次错误的日期时间,然后不发送其他错误,直到日期时间+一段时间过去。 – Tejs 2011-06-01 17:31:29

回答

1

叹了口气,原来我没有正确检查我的cookie。

我是做

HttpCookie exist = Response.Cookies[keyName]; 

代替

HttpCookie exist = Request.Cookies[keyName]; 
2

我个人使用的ErrorsContoller来处理错误:

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"); 
    } 
} 

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

嗨达林,谢谢你处理错误的替代方法。我们有很多旧的Web表单应用程序,这就是为什么我想使用global.asax的原因,但是我们的许多新应用程序都使用mvc,所以我会把它放在我的后面的口袋里。 – Lareau 2011-06-02 12:18:42

相关问题