2017-01-19 1 views
0

아래 코드는 매우 저조합니다. .Net StopWatch 클래스를 사용하여 어떤 코드가 느려졌는지 확인했습니다. 20 이메일매우 느린 EWS API로 이메일 보내기

message.SendAndSaveCopy(); 

예컨대 배치 : 이 줄은 문제가 될 것으로 보인다 첫번째 이메일을 보내 약 2 초 정도이 시간이 점차-18 초가 걸립니다 20 이메일까지 증가한다.

public int SendBulkMarketing(bool CheckDelivery) 
{ 
    int iCounter = 0; 
    DataTable dt = null; 
    try 
    { 
     DeliveryReportDAL myDeliveryReportDAL = new DeliveryReportDAL(); 
     dt = myDeliveryReportDAL.GetListMessageToSend('E'); 
     if (dt == null) return iCounter; 
     iCounter = dt.Rows.Count; 
    } 
    catch (Exception ex) 
    { 
     new Util().LogError(ex, "SMTP:: SendBulkMarketing 1st catch"); 
     return 0; 
    } 
    if (iCounter > 0) 
    { 
     ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1); 
     service.Credentials = new WebCredentials(Account_UserName, Account_Password, Account_Domain); 
     service.Url = new Uri(Service_URL); 

     for (int I = 0; I < iCounter; ++I) 
     { 
      try 
      { 
       string myGUID = "{" + dt.Rows[I]["GUID"].ToString() + "}"; 
       if (IsValidEmailAddress(dt.Rows[I]["OwnerEmail"].ToString()) == false) 
       { 
        DeliveryReportDAL myReport = new DeliveryReportDAL(); 
        myReport.SaveSentStatus(myGUID, 'G', 3); 
        continue; 
       } 

       EmailMessage message = new EmailMessage(service); 
       message.Subject = dt.Rows[I]["TemplateSubject"].ToString(); 
       message.Body = dt.Rows[I]["TemplateText"].ToString().Replace("\0", " "); 
       message.ToRecipients.Add(dt.Rows[I]["OwnerEmail"].ToString()); 
       message.IsDeliveryReceiptRequested = true; 
       Guid myPropertySetId = new Guid(myGUID); 

       ExtendedPropertyDefinition myExtendedPropertyDefinition = new ExtendedPropertyDefinition(myPropertySetId, "blablabla", MapiPropertyType.String); 

       ServicePointManager.ServerCertificateValidationCallback = 
       delegate(object sender1, 
         System.Security.Cryptography.X509Certificates.X509Certificate certificate, 
         System.Security.Cryptography.X509Certificates.X509Chain chain, 
         System.Net.Security.SslPolicyErrors sslPolicyErrors) 
       { return true; }; 

       message.SendAndSaveCopy(); 

       DeliveryReportDAL myReport1 = new DeliveryReportDAL(); 
       myReport1.SaveSentStatus(dt.Rows[I]["GUID"].ToString(), 'G', 1); 
      } 
      catch (Exception ex) 
      { 
       new Util().LogError(ex, "SMTP:: SendBulkMarketing 2nd catch"); 
      } 
     } 
    } 
    return iCounter; 
} 

필자는 코드 성능 향상에 큰 도움을 주셔서 감사합니다.

+0

나는 정확한 문제를 잘 모릅니다하지만 링크가 더 디버깅에 당신을 위해 도움이 될 수 아래 이를 읽고 더 로깅을 확인하려고 LINK 추적하십시오 https://blogs.msdn.microsoft.com/를 webdav_101/2015/05/03/ews-best-practices-tracing-and-logging/ 모범 사례를 보려면 여기를 읽어보십시오. https://blogs.msdn.microsoft.com/webdav_101/2016/04/12/ews -managed-api-coding-for-exchange/ 결과가 알려 주시면 알려주세요. –

+0

@SivakrishnaDonepudi 귀하의 도움에 감사드립니다. 그러나 로깅/추적 기능을 이미 활용했지만 어떤 답변도 제공하지 못했으며 모범 사례도 완전히 알고 있습니다. 이 문제는 Exchange 서버의 정책, 특히 MessageRateLimit 정책의 제한으로 인한 것일 수 있습니다. 나는 이것을 조사 중이다. – MadDev

답변

0

이 성능 문제가 해결되었습니다.

이것은 기본적인 코딩 문제였습니다. 이 문제는 for 루프 내부에서 호출 된 별도의 메서드 호출 (제공된 코드 조각에는 표시되지 않음) 때문에 발생했습니다. 성능이 많은 기능이 포함되어 있지만 for 루프 내부에서 호출 할 필요는 없습니다.

for 루프 외부에서이 성능 과중한 메서드 호출을 이동하면 문제가 해결됩니다.