/// <summary> /// Application_Start 시에 실행할 비동기 작업의 본체입니다. /// </summary> protected override void ApplicationStartAfter(HttpContext context) { base.ApplicationStartAfter(context); var appPath = context.GetApplicationRootPath(); // 여기에 비동기 작업을 정의하면 됩니다. // 메일을 보낸다던지 하더는 일... Task.Factory .StartNew(() => new SmtpClient("mail.realweb21.com") .Send("*****@*****.**", "*****@*****.**", "웹 응용프로그램 시작 시 메일보내기", string.Concat(appPath, " 가 시작했습니다... Machine=", Server.MachineName))) .ContinueWith(task => { if(task.IsFaulted) if(log.IsErrorEnabled) log.ErrorException("알림 메일 발송에 실패했습니다.", task.Exception); if(task.IsCompleted) if(IsDebugEnabled) log.Debug("알림 메일을 발송했습니다!!!"); }, TaskContinuationOptions.LongRunning); Task.Factory .StartNew(() => With.TryAction(() => AppDomain.CurrentDomain .GetAssemblies() .RunEach(asm => log.Debug("Assembly=[{0}]", asm))), TaskCreationOptions.LongRunning); }
/// <summary> /// Application_Error 시에 비동기적으로 실행할 작업입니다. (기본적으로는 로그에 쓰는 작업을 합니다) /// overriding 시 base method를 호출해 주셔야합니다. /// </summary> /// <param name="context">현재 Context 정보</param> /// <param name="exception">Web Applicatoin 예외 정보</param> protected override void ApplicationErrorAfter(HttpContext context, Exception exception) { base.ApplicationErrorAfter(context, exception); var appPath = context.GetApplicationRootPath(); // 예외 발생 시 관리자에게 메일을 보냅니다. Task.Factory .StartNew(() => new SmtpClient("mail.realweb21.com") .Send("*****@*****.**", "*****@*****.**", appPath ?? HostingEnvironment.ApplicationVirtualPath + " 에서 예외가 발생했습니다.", "예외 정보" + Environment.NewLine + exception)) .ContinueWith(task => { if(task.IsFaulted) if(log.IsErrorEnabled) { log.Error("예외에 대한 메일 발송에 실패했습니다."); log.Error(task.Exception); } if(task.IsCompleted) if(IsDebugEnabled) log.Debug("예외에 대한 메일을 발송했습니다!!!"); }, TaskContinuationOptions.ExecuteSynchronously); }