2014-04-17 1 views
1

Мне нужно уловить любую ошибку в Application_Start() и перенаправить на страницу ошибок HTML, но NLog ничего не записывает, если у меня есть ошибка, например , база данных недоступна:Получить ошибки в Application_Start() с NLog и перенаправить на дружественную ошибку страницы

private static Logger logger = LogManager.GetCurrentClassLogger(); 

protected void Application_Start() 
{ 
    try 
    { 
     AreaRegistration.RegisterAllAreas(); 
     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     AutofacConfig.RegisterDependencies(); 
     AutoMapperConfiguration.Configure(); 
     AuthConfig.RegisterAuth(); 
     SimpleMemberShipConfig.SimpleMembershipInitializer(); 
     EntityFrameworkConfig.Configure(); 
    } 
    catch (Exception e) 
    { 
     logger.Error(e); 
    } 
} 

NLog конфигурации:

<targets> 

    <target xsi:type="File" name="Heelp_log" fileName="${basedir}/logs/Heelp-${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${callsite:className=true:includeSourcePath=true:methodName=true} ${message}" /> 

</targets> 
<rules> 

    <logger name="*" minlevel="Error" writeTo="Heelp_log" /> 

</rules> 

перенаправление у меня есть:

<customErrors mode="On" defaultRedirect="~/Views/Shared/Error.html" /> 

Но он идет на страницу, как это (/Views/Shared/Error.html?aspxerrorpath=/):

Server Error in '/' Application. 

Runtime Error 

Description: An exception occurred while processing your request. Additionally, another exception occurred while executing the custom error page for the first exception. The request has been terminated. 

ответ

0

Добавить метод в Gloabal.Ascx

protected void Application_Error() 
    { 
     var exception = Server.GetLastError(); 
     var httpException = exception as HttpException; 
     Response.Clear(); 
     Server.ClearError(); 
     var routeData = new RouteData(); 
     routeData.Values["controller"] = "Error"; 
     routeData.Values["action"] = "General";    
     routeData.Values["exception"] = exception; 
     Response.StatusCode = 500; 
     if (httpException != null) 
     { 
      Response.StatusCode = httpException.GetHttpCode(); 
      switch (Response.StatusCode) 
      { 
       case 403: 
        routeData.Values["action"] = "Http403"; 
        break; 
       case 404: 
        routeData.Values["action"] = "Http404"; 
        break; 
      } 
     } 

     IController errorsController = new ErrorController(); 
     var rc = new RequestContext(new HttpContextWrapper(Context), routeData); 
     errorsController.Execute(rc); 
    } 

и добавить ErrorController

public class ErrorController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult General() 
    {    
     return RedirectToAction("Index", "Error"); 
    } 

    public ActionResult Http404() 
    { 
     return View(); 
    } 

    public ActionResult Http403() 
    { 
     return View(); 
    } 
} 

Добавьте соответствующие мнения к тем же

Надеется, что это может помочь вам. Спасибо и хорошего дня.

+0

Привет, спасибо! Как вы предлагаете мне регистрировать ошибку, используя NLog? – Patrick