Можно ли установить куки в Application_error

Я пытаюсь выяснить, могу ли я установить файл cookie во время события Application_Error() для global.asax.

Когда я отлаживаю свое приложение, похоже, что код добавляет файл cookie, но при следующей загрузке файл cookie исчезает. Он воссоздает файл cookie каждый раз. Я попробовал это локально (используя казино) или сервер.

Я начинаю думать, что это невозможно сделать.

Вот фрагмент кода.

глобальный асакс

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

Обновление - чтобы ответить на комментарий Тейса. Целью проекта будет отправить сообщение об ошибке по электронной почте (это легко сделать). Я пытаюсь найти способ предотвратить спам в почтовом ящике, если пользователь постоянно нажимает F5 (хотя файлы cookie могут быть хорошей идеей).

обновление 2 - я изменил свой глобальный asax, чтобы он был ближе к тому, чего я пытаюсь достичь


person Lareau    schedule 01.06.2011    source источник
comment
Почему вы ХОТИТЕ установить куки на Application_Error?   -  person Tejs    schedule 01.06.2011
comment
Обновил мой вопрос с моими рассуждениями Tejs   -  person Lareau    schedule 01.06.2011
comment
Если вы хотите предотвратить рассылку спама, вам нужно реализовать какое-то регулирование; обычно это просто отметка даты и времени последней ошибки, а затем не отправка по электронной почте другой ошибки до тех пор, пока не истечет дата-время + некоторое время.   -  person Tejs    schedule 01.06.2011
comment
есть ли у вас какой-либо код, который пытается прочитать файл cookie во время ТАКОГО ЖЕ запроса, который был создан до того, как он перешел в браузер? У меня было приложение, в котором нужно было исправить хаос, связанный с желанием удалить файлы cookie во время состояния ошибки, и все мои проблемы были вызваны чтением файла cookie. Я обошел это, передав объект с состоянием, который в конце строки преобразуется в файл cookie, когда он находится в состоянии ошибки.   -  person Chris Marisic    schedule 01.06.2011


Ответы (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));
}
person Darin Dimitrov    schedule 01.06.2011
comment
Привет Дарин, спасибо за этот альтернативный способ обработки ошибок. У нас есть много старых приложений веб-форм, поэтому я хотел использовать global.asax, но многие из наших новых приложений используют mvc, поэтому я буду держать это в своем заднем кармане. - person Lareau; 02.06.2011

Эх, оказалось, что я не проверял свои куки должным образом.

я делал

HttpCookie exist = Response.Cookies[keyName];

вместо

HttpCookie exist = Request.Cookies[keyName];
person Lareau    schedule 02.06.2011