2011-06-01 16 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

相關問題