【问题标题】:Is it possible set cookies in Application_error是否可以在 Application_error 中设置 cookie
【发布时间】:2011-09-06 10:20:30
【问题描述】:

我正在尝试查看是否可以在 global.asax 的 Application_Error() 事件期间设置 cookie。

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

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

这是一些 sn-p 代码。

全局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(我认为 cookie 可能是个好主意),我正在尝试找出一种方法来防止邮箱收到垃圾邮件。

更新 2 - 我已更改我的全局 asax 以反映更接近我想要完成的目标

【问题讨论】:

  • 为什么要在 Application_Error 上设置 cookie?
  • 用我的推理 Tejs 更新了我的问题
  • 如果你想防止垃圾邮件,你需要实现某种限制;通常这只是标记最后一个错误的日期时间,然后在日期时间+一段时间过去之前不会通过电子邮件发送另一个错误。
  • 您是否有任何代码在它进入浏览器之前创建的 SAME 请求期间尝试读取 cookie?我有一个应用程序需要修复与在错误状态下想要删除 cookie 有关的混乱问题,而我的问题都是由读取 cookie 引起的。我通过传递一个有状态的对象来规避这个问题,当处于错误状态时,该对象会在行尾转换为 cookie。

标签: c# asp.net asp.net-mvc-3 cookies application-error


【解决方案1】:

我个人使用 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));
}

【讨论】:

  • 嗨,Darin,感谢您提供这种处理错误的替代方法。我们有很多旧的 Web 表单应用程序,这就是我想使用 global.asax 的原因,但我们的许多新应用程序都在使用 mvc,所以我会把它放在我的后兜里。
【解决方案2】:

唉,原来我没有正确检查我的 cookie。

我在做

HttpCookie exist = Response.Cookies[keyName];

而不是

HttpCookie exist = Request.Cookies[keyName];

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2019-07-20
    • 2021-08-15
    • 2022-08-08
    • 2019-06-10
    • 2011-07-19
    • 2011-02-22
    • 2012-05-21
    • 2018-01-28
    相关资源
    最近更新 更多