Я работаю над приложением MVC3 и использую Elmah для ведения журнала ошибок.В моем приложении я хочу перенести идентификатор Elmah на пользовательскую страницу ошибок, поскольку я предоставлю ссылку, которая позволит пользователю специально сообщать об этом в случае повторной ошибки (по их мнению).
Теперь я прочитал похожие вопросы здесь, и они предлагают добавить следующий код (или аналогичный) в файл Global.asax.cs:
void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{
string sessionId = Session.SessionID;
Session["ElmahId_" + sessionId] = args.Entry.Id;
}
Это то, что я использую намомент, с SessionID, обеспечивающим дополнительную гибкость в создании уникального хранимого объекта Session.Тем не менее, это может по-прежнему вызывать проблемы, если в одно и то же время (более) происходит несколько ошибок.
Вместо этого я решил поработать над своим собственным атрибутом HandleErrorAttribute, который выглядит примерно так:
public class ElmahHandleErrorAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
if (filterContext == null)
throw new ArgumentNullException("filterContext");
if (filterContext.IsChildAction && (!filterContext.ExceptionHandled
&& filterContext.HttpContext.IsCustomErrorEnabled))
{
Elmah.ErrorSignal.FromCurrentContext().Raise(filterContext.Exception);
// get error id here
string errorId = null;
string areaName = (String)filterContext.RouteData.Values["area"];
string controllerName = (String)filterContext.RouteData.Values["controller"];
string actionName = (String)filterContext.RouteData.Values["action"];
var model = new ErrorDetail
{
Area = areaName,
Controller = controllerName,
Action = actionName,
ErrorId = errorId,
Exception = filterContext.Exception
};
ViewResult result = new ViewResult
{
ViewName = "Error",,
ViewData = new ViewDataDictionary<ErrorDetail>(model),
TempData = filterContext.Controller.TempData
};
filterContext.Result = result;
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
}
где ErrorDetail - это пользовательская модель, которая просто имеет открытые свойства, которые задаются здесь как строки.Затем эти данные можно быстро отобразить в модели для администраторов, а errorId можно использовать для создания ссылки «Сообщить об ошибке».
Так что мой вопрос: знает ли кто-нибудь способ получения идентификаторапосле строки
Elmah.ErrorSignal.FromCurrentContext().Raise(filterContext.Exception)
без использования события Logged в global.asax.cs?
Любые мысли приветствуются.