Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 以编程方式在邮件上处理Elmah电子邮件_Asp.net_Asp.net Mvc_Elmah - Fatal编程技术网

Asp.net 以编程方式在邮件上处理Elmah电子邮件

Asp.net 以编程方式在邮件上处理Elmah电子邮件,asp.net,asp.net-mvc,elmah,Asp.net,Asp.net Mvc,Elmah,我对Elmah有意见,我已经覆盖了邮件方法。我希望它在我的应用程序不处于实时模式时处理邮件(基本上不发送邮件)。问题是,当我执行此操作时,当我的ErrorHandler(在我的ASP.NET MVC应用程序中)尝试使用Elmah引发异常时,我得到错误:无法访问已处置的对象。对象名称:'System.Net.Mail.MailMessage'。所以我需要想办法解决这个问题。代码如下: 电邮方式: public static void ErrorMail_Mailing(object sender,

我对Elmah有意见,我已经覆盖了邮件方法。我希望它在我的应用程序不处于实时模式时处理邮件(基本上不发送邮件)。问题是,当我执行此操作时,当我的ErrorHandler(在我的ASP.NET MVC应用程序中)尝试使用Elmah引发异常时,我得到错误:无法访问已处置的对象。对象名称:'System.Net.Mail.MailMessage'。所以我需要想办法解决这个问题。代码如下:

电邮方式:

public static void ErrorMail_Mailing(object sender, ErrorMailEventArgs e)
        {
            if (!GlobalHelper.IsLiveMode)
            {

                //e.Mail.Dispose();
            }
            else
            {
                MailAddressCollection MAC = new MailAddressCollection();
                foreach (string a in EmailRecipients.Split(','))
                {
                    MAC.Add(a);
                }

                string b = "errors@" + GlobalHelper.AppName + ".com";
                e.Mail.From = new MailAddress(b);
                e.Mail.To.Clear(); // Clears existing mail addresses
                e.Mail.To.Add(MAC.ToString());
                e.Mail.Subject = GlobalHelper.AppName+ " Error: ("+e.Error.Type.Substring(0,10)+") Deployment Level:"+GlobalHelper.DeploymentMode;

            }
Errorhandler方法:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    public class CustomHandleErrorAttribute : HandleErrorAttribute
    {

        public override void OnException(ExceptionContext context)
        {
            // Bail if we can't do anything; app will crash.
            if (context == null)
                return;
            var ex = context.Exception ?? new Exception("No further information exists.");

            // Can show Data on view page /w this code
            // var data = new ErrorPresentation
            //{
            //  ErrorMessage = HttpUtility.HtmlEncode(ex.Message),
            //  TheException = ex,
            //  ShowMessage = !(filterContext.Exception == null),
            //  ShowLink = false
            //};
            //filterContext.Result = View("ErrorPage", data);

            context.ExceptionHandled = true;

            //Log to Elmah
            ErrorSignal.FromCurrentContext().Raise(ex);

            //Show Custom view page
            context.Result = new ViewResult { ViewName = "Error" };
        }
    }
堆栈跟踪:

System.Net.Mail.SmtpException: Failure sending mail. ---> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Mail.MailMessage'.
   at System.Net.Mail.MailMessage.get_AlternateViews()
   at System.Net.Mail.MailMessage.SetContent()
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   --- End of inner exception stack trace ---
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at Elmah.ErrorMailModule.SendMail(MailMessage mail)
   at Elmah.ErrorMailModule.ReportError(Error error)
   at Elmah.ErrorMailModule.OnError(Exception e, HttpContext context)
   at Elmah.ErrorMailModule.OnErrorSignaled(Object sender, ErrorSignalEventArgs args)
   at Elmah.ErrorSignalEventHandler.Invoke(Object sender, ErrorSignalEventArgs args)
   at Elmah.ErrorSignal.Raise(Exception e, HttpContext context)
   at Elmah.ErrorSignal.Raise(Exception e)
   at MusingMonkey.Utilities.Filters.CustomHandleErrorAttribute.OnException(ExceptionContext context) in C:\Users\William-Business\Desktop\TWB\TWB Central\Projects\MusingMonkey\MusingMonkey\Utilities\Filters\ErrorHandler.cs:line 34
   at System.Web.Mvc.ControllerActionInvoker.InvokeExceptionFilters(ControllerContext controllerContext, IList`1 filters, Exception exception)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state)
   at System.Web.Mvc.Controller.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout)
   at System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout)
   at System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state)
   at System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state)
   at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__3(AsyncCallback asyncCallback, Object asyncState)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout)
   at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<BeginProcessRequest>b__2()
   at System.Web.Mvc.SecurityUtil.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a()
   at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f)
   at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)
   at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust[TResult](Func`1 func)
   at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
   at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
   at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
System.Net.Mail.SmtpException:发送邮件失败。-->System.ObjectDisposedException:无法访问已处置的对象。
对象名称:“System.Net.Mail.MailMessage”。
在System.Net.Mail.MailMessage.get_AlternateViews()上
在System.Net.Mail.MailMessage.SetContent()中
在System.Net.Mail.SmtpClient.Send(邮件消息)上
---内部异常堆栈跟踪的结束---
在System.Net.Mail.SmtpClient.Send(邮件消息)上
在Elmah.ErrorMailModule.SendMail(邮件消息邮件)
在Elmah.ErrorMailModule.ReportError(错误)
位于Elmah.ErrorMailModule.OnError(异常e,HttpContext上下文)
在Elmah.ErrorMailModule.OneErrorSignaled(对象发送方,ErrorSignalEventArgs args args)
在Elmah.ErrorSignalEventHandler.Invoke(对象发送方,ErrorSignalEventArgs args args)
在Elmah.ErrorSignal.Raise(异常e,HttpContext)
在Elmah.ErrorSignal.Raise(异常e)
在C:\Users\William Business\Desktop\TWB\TWB Central\Projects\MusingMonkey\MusingMonkey\Utilities\Filters.CustomHandleErrorAttribute.OneException(ExceptionContext上下文)中的MusingMonkey.Utilities.Filters.OneException(异常上下文):第34行
位于System.Web.Mvc.ControllerActionInvoker.InvokeeExceptionFilters(ControllerContext ControllerContext,IList`1过滤器,异常)
在System.Web.Mvc.Async.AsyncControllerActionInvoker.c_uuDisplayClass25.b_u1E(AsyncCallback AsyncCallback,Object asyncState)
位于System.Web.Mvc.Async.AsyncResultRapper.WrappedAsyncResult`1.Begin(异步回调、对象状态、Int32超时)
位于System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext ControllerContext,String actionName,AsyncCallback回调,对象状态)
在System.Web.Mvc.Controller.c__displayClassId.b_uu 17(AsyncCallback AsyncCallback,Object asyncState)
位于System.Web.Mvc.Async.AsyncResultRapper.WrappedAsyncResult`1.Begin(异步回调、对象状态、Int32超时)
位于System.Web.Mvc.Controller.BeginExecuteCore(异步回调,对象状态)
位于System.Web.Mvc.Async.AsyncResultRapper.WrappedAsyncResult`1.Begin(异步回调、对象状态、Int32超时)
位于System.Web.Mvc.Controller.BeginExecute(RequestContext RequestContext、AsyncCallback回调、对象状态)
位于System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext RequestContext、AsyncCallback回调、对象状态)
在System.Web.Mvc.MvcHandler.c__DisplayClass6.c__DisplayClassb.b__3(AsyncCallback AsyncCallback,Object asyncState)
位于System.Web.Mvc.Async.AsyncResultRapper.WrappedAsyncResult`1.Begin(异步回调、对象状态、Int32超时)
在System.Web.Mvc.MvcHandler.c_uuudisplayClass6.b_uuu2()中
在System.Web.Mvc.SecurityUtil.c__DisplayClassb`1.b__a()中
在System.Web.Mvc.SecurityUtil.b_0(操作f)
位于System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(操作)
位于System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust[TResult](Func`1 Func)
位于System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext、AsyncCallback回调、对象状态)
位于System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext HttpContext,AsyncCallback回调,对象状态)
位于System.Web.Mvc.MvcHandler.System.Web.IHTTPassynchandler.BeginProcessRequest(HttpContext上下文、AsyncCallback cb、Object extraData)
在System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()中
在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)

问题是ELMAH试图使用
邮件消息来发送它,但您已经处理了该对象。对您来说,最好的解决方案是不通过事件执行此操作,而是通过继承并重写其方法,如下所示:

protected override void SendMail(MailMessage mail)
{
    if (!GlobalHelper.IsLiveMode) 
        base.SendMail(mail);
}

然后,您可以继续在
邮件
事件处理程序中执行其余操作。

嘿,Atif,我已经尝试过了,但是我无法让web.config找到我的自定义elmah类!也许这是我们可以单独讨论的问题?我想在这里的简短评论中很难解决配置问题。