1

global.asaxのApplication_Error()イベント中に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キーを押し続けた場合に、メールボックスがスパムになるのを防ぐ方法を見つけようとしています(Cookieは良い考えかもしれませんが)。

更新2-達成しようとしていることに近いものを反映するようにグローバルasaxを変更しました

4

2 に答える 2

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));
}
于 2011-06-01T15:56:37.510 に答える
1

ため息をついて、私は自分のクッキーを適切にチェックしていなかったことがわかりました。

やっていた

HttpCookie exist = Response.Cookies[keyName];

それ以外の

HttpCookie exist = Request.Cookies[keyName];
于 2011-06-02T21:59:59.623 に答える