Getting the Id of an error in Elmah after calling .Raise()

前端 未结 4 1748
悲&欢浪女
悲&欢浪女 2021-02-15 13:39

I\'m working on an MVC3 application and I\'m using Elmah to handle my error logging. What I want in my application is to carry the Elmah Id onto the custom error page as I will

4条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-02-15 13:48

    After reading Dupin's comments it seems logical that it isn't quite possible. I tried digging around the Elmah source code and came up with a couple of alternatives that might be worth sharing.

    The obvious alternative is stick with my original option of using the Logged event:

    void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
    {
        string sessionId = Session.SessionID;
        Session["ElmahId_" + sessionId] = args.Entry.Id;
    }
    

    For a more direct solution it is possible to manually log the error with the following:

    string errorId = Elmah.ErrorLog.GetDefault(HttpContext.Current)
        .Log(new Elmah.Error(filterContext.Exception));
    

    However, using this approach won't hit your filters or mail module and so on.

    After doing a bit of thinking and a little more searching, I came up with a new compromise. Still using the logged event but I've found a way to create a new unique key that can be passed to the view, by adding my own data to the exception.

    string loggingKey = "ElmahId_" + Guid.NewGuid().ToString();
    filterContext.Exception.Data.Add("LoggingKey", loggingKey);
    

    This way I can pass the exception in my view model, which has this key value in the Data collection. The logged event would be changed to something like this:

    void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
    {
        string key = args.Entry.Error.Exception.Data["LoggingKey"].ToString();
        Session[key] = args.Entry.Id;
    }
    

    Then in the view I get the key from the model to then pull the Id from the Session collection.

提交回复
热议问题