zoukankan      html  css  js  c++  java
  • 异步邮件阻塞MVC请求

    异步邮件阻塞MVC请求

    问题代码如下:


     public class EmailHelper

        {
            private MailHost mailHost = null;
            private HttpContext context;
            public event SendMailComplete SendComplete;
            private SmtpClient client;

            public EmailHelper()
            {
                context = HttpContext.Current;
                client = new SmtpClient();
                mailHost = new MailHost();
    mailHost.Host = GetAzureAppSetting("MailServer");
    mailHost.UserName = GetAzureAppSetting("MailUserName");
    mailHost.Password = GetAzureAppSetting("MailPassword");
            }

            public void SendMail(string From, string[] To, string[] CC, string Subject, string Body)
            {

                client.Host = mailHost.Host;
                client.UseDefaultCredentials = false;
                client.Credentials = new NetworkCredential(mailHost.UserName, mailHost.Password);
                client.DeliveryMethod = SmtpDeliveryMethod.Network;

                MailMessage message = new MailMessage();
                MailAddress mailfrom = new MailAddress(From, GetDisplayName(From));
                Encoding mailencoding = Encoding.UTF8;  // Encoding.GetEncoding(GetEncoding(dt.Rows[0]["CharacterSet"].ToString()));
                message.From = mailfrom;

                foreach (string to in To)
                {
                    if (to != string.Empty)
                    {
                        message.To.Add(to);
                    }
                }
                foreach (string cc in CC)
                {
                    if (cc != string.Empty)
                    {
                        message.CC.Add(cc);
                    }
                }
                message.Subject = Subject;
                message.Sender = mailfrom;
                message.Body = Body;
                message.BodyEncoding = mailencoding;
                message.SubjectEncoding = mailencoding;
                message.IsBodyHtml = true;

                // use new async email as the old one above will block mvc request/response 

                client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
                client.SendAsync(message, null);
            }

     解决方法如下:


            public static void InternalSendEmail(MailMessage mail, SmtpClient smtpClient) 
            {
                InternalSendEmail(mail, smtpClient, true); 
            }
            public static void InternalSendEmail(MailMessage mail, SmtpClient smtpClient, Boolean Async)
            {
                if (Async)
                {
                    InternalSendEmailDelegate ised = new InternalSendEmailDelegate(smtpClient.Send);
                    AsyncCallback acb = new AsyncCallback(InternalSendEmailResponse);
                    ised.BeginInvoke(mail, acb, ised);
                }
                else
                {
                    smtpClient.Send(mail);
                }
            }
            private delegate void InternalSendEmailDelegate(MailMessage m);
            private static void InternalSendEmailResponse(IAsyncResult ar)
            {
                InternalSendEmailDelegate ised = (InternalSendEmailDelegate)(ar.AsyncState);
                ised.EndInvoke(ar);
            }

    参考:

    http://weblogs.asp.net/jeffwids/archive/2009/10/12/asynchronously-sending-a-system-net-mail-mailmessage-in-c.aspx?CommentPosted=true#commentmessage

    https://connect.microsoft.com/VisualStudio/feedback/details/688210/smtpclient-sendasync-blocking-my-asp-net-mvc-request#details 

  • 相关阅读:
    Java中的事务
    ABCDE
    Android 防内存泄露handler
    自建应用新花样,菜鸟也会做应用
    软件測试之独步武林系列(一)
    刚在在win8.1下装了ubuntu12.04
    SVN 的一些操作
    [华为机试练习题]42.求二叉树的深度和宽度
    iOS_正則表達式
    在应用中更新App版本号
  • 原文地址:https://www.cnblogs.com/dlbrant/p/2327787.html
Copyright © 2011-2022 走看看