Основное соединение было закрыто: при отправке произошла непредвиденная ошибка - PullRequest
1 голос
/ 20 октября 2011

У меня есть подпрограмма Windows Service, которая написана на [C #]. Net с использованием VS 2010, которая обращается к БД один раз в день, и если есть какие-либо записи, которые необходимо устранить Этим владельцам записей будет отправлено электронное письмо через сервер Exchange. Для первых нескольких записей электронные письма отправляются нормально, но после 4-го или 5-го электронного письма я получаю сообщение об ошибке, как показано

Service failed at :System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Net.TlsStream.CallProcessAuthentication(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
   at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.ConnectStream.WriteHeaders(Boolean async)
   --- End of inner exception stack trace ---
   at System.Net.HttpWebRequest.GetResponse()
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.Emit(HttpWebRequest& request)
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(HttpWebRequest& request)

Если я отлаживаю процедуру с точками останова, она работает нормально. Но когда я запускаю его без каких-либо точек останова, я получаю вышеуказанную ошибку. Вот фрагмент кода, в котором моя программа отправляет электронные письма:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
lock (service)
{
   if (service == null)
      throw new Exception("service is null");
   service.Credentials = new WebCredentials(data[0], data[1]);
   service.Url = new Uri("https://owa.CompanyName.com/ews/exchange.asmx");
   service.Timeout = 1200000;
   EmailMessage message = new EmailMessage(service);
   if (message == null)
       throw new Exception("message is null");
       message.Subject = "Test Email";
       message.Body = "This is a Test EMail Please use the below link to update ";

//message.ToRecipients.Add(docList[0].CreatorEmailID);
       message.ToRecipients.Add("EmailID@gmail.com");
       for (int j = 0; j < emailList.Count; j++)
       {
          message.CcRecipients.Add("EmailID@gmail.com”);
       }
       System.Threading.Thread.Sleep(1000);
       ServicePointManager.ServerCertificateValidationCallback += ignoreCertCallback;
       try
       {
        message.Send();
       }
       finally
       {
       ServicePointManager.ServerCertificateValidationCallback -= ignoreCertCallback;
       }
}

Я использовал Microsoft Exchange WebService в качестве веб-ссылки здесь. Я пытался погуглить, но это не помогло мне. Я был бы очень рад, если бы кто-то мог помочь мне в этом вопросе.

Ответы [ 5 ]

2 голосов
/ 20 октября 2011

Мое предположение:

Exchange не нравится количество соединений, которые вы открываете за короткий промежуток времени, и думает, что оно атаковано и впоследствии не позволяет вам устанавливать больше соединений.

Первое, что я хотел бы сделать, это перекодировать этот «сервис». Вы не хотите создавать новый экземпляр для каждого сообщения. Просто повторно используйте существующий объект. Кроме того, отправляйте свои сообщения по одному.

В качестве альтернативы, поговорите с вашим администратором Exchange, чтобы узнать, знают ли они, как перенастроить обмен, чтобы разрешить ваш спам, я имею в виду очень важные сообщения, через ..;)

1 голос
/ 21 октября 2011

Давайте посмотрим ...

Работает в отладчике с точками останова, не работает без.

Возможно, вам нужно ограничить скорость.

0 голосов
/ 25 января 2014

в IIS, сертификат ssl не был выбран. Возможно был удален настройками Fiddler ... Я воссоздал ssl сертификат с командой makecert и eureka! У меня была эта ошибка при вызове веб-службы на https://

0 голосов
/ 07 января 2014

Обычно, если есть проблема с сертификатом, используйте это, когда вы делаете запрос,

ServicePointManager.ServerCertificateValidationCallback + = new System.Net.Security.RemoteCertificateValidationCallback (ValidateServerCertificate);

* 1004.and

public static bool ValidateServerCertificate (отправитель объекта, сертификат X509Certificate, цепочка X509Chain, SslPolicyErrors sslPolicyErrors) {return true;}

0 голосов
/ 28 августа 2013

У меня та же проблема, но мой код корректен в отладчике на localhost. Когда я загрузил свое приложение, и кто-то хочет отправить электронное письмо, появляется эта ошибка. Получено неожиданное EOF или 0 байтов из транспортного потока.

try
        {
            string txtBody = "";
            string emailUser = ConfigurationManager.AppSettings["MailAuthUser"];
            string emailPass = ConfigurationManager.AppSettings["MailAuthPass"];
            string mailServer = ConfigurationManager.AppSettings["MailServer"];

            txtBody = "<b>" + ("موضوع:" + "  " + emailmod.Subject + "</b>" + "<br/><br/><b>" + "ارسال کننده: </b>" + emailmod.SenderEmail + "<br/><br/><b>" + "پیام: </b>" + emailmod.Message + "<br/><br/>" + emailmod.PagePath);

            ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;
            ExchangeService exservice = new ExchangeService();
            AutodiscoverService auservice = new AutodiscoverService(mailServer);
            if (auservice.ServerInfo != null)
            {
                try
                {
                    exservice.AutodiscoverUrl(emailUser);
                }
                catch (AutodiscoverRemoteException ex)
                {
                    //Console.WriteLine("Exception thrown: " + ex.Error.Message);
                }
            }
            else
            {
                exservice.Url = new Uri("https://" + "outlook.apornak.com" + "/EWS/Exchange.asmx");
            }
            exservice.UseDefaultCredentials = true;


            if (exservice.ServerInfo == null)
            {
                exservice.Credentials = new WebCredentials(emailUser, emailPass);
            }

            EmailMessage message = new EmailMessage(exservice);
            message.Subject = "اعلام ایرادات و پیشنهادات";
            message.Body = Resources.Message.AdvMailTemplate.Replace("#$Body$#", txtBody);
            message.ToRecipients.Add("support@apornak.com");
            message.From = "اعلام ایرادات و پیشنهادات";
            message.ReplyTo.Add( emailmod.SenderEmail);
            message.Save();

            message.SendAndSaveCopy();
            return Json(true);
        }
        catch (Exception)
        {
            { return Json(false); }
            throw;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...