2012-04-10 3 views
2

Je suis en train d'écrire du code pour télécharger et traiter les pièces jointes des messages électroniques, puis les traiter. Le code fonctionne comme requis dans certains cas, mais a toujours quelques problèmes majeurs.Exchange Web Services La charge de pièces jointes est lente

Chaque fois que le code charge la pièce jointe dans un fichier sur le disque local, il faut un très long temps de le faire et souvent avec l'exception suivante à la suite du téléchargement lent:

A first chance exception of type 'Microsoft.Exchange.WebServices.Data.ServiceRequestException' occurred in Microsoft.Exchange.WebServices.dll 

Je peux me tromper, mais si le serveur d'échange en question est sur le même réseau gigabit que le serveur exécutant le code et Outlook a un accès rapide aux e-mails, pièces jointes, etc les pièces jointes devraient télécharger beaucoup plus rapidement et beaucoup plus régulièrement. Voici quelques exemples des temps de téléchargement/chargement:

  • 800KB Zip - 1m 4s
  • 840KB Zip - 6 m 18s
  • 1.33MB Zip - 11m 23s
  • 2.78MB Zip - 17m 3s

J'ai essayé de régler le paramètre de délai de connexion EWS à 300000ms au lieu de 100000ms par défaut pour donner plus de temps aux pièces jointes à télécharger et le nombre d'exceptions a légèrement diminué mais le temps d'attente est maintenant trop long.

Le code s'exécute dans les threads, pas plus de 8 à la fois (10 étant la limite d'étranglement pour EWS je crois), mais je ne peux pas imaginer que cela ferait une grande différence. (Cela n'a pas été le cas lorsque j'ai testé des courriels uniques à la fois).

Voici le code fileté qui télécharge les pièces jointes (quelques bits de l'ONU liés supprimés pour simplifier):

 Dim strMessageFolder As String 

     ' Prepare the directory where this emails attachments will be stored 
     strMessageFolder = g_strFolder_Temp & strMessageID & "\" 

     ' Create a folder to store the attachments for this email 
     Call FileSystem_CreateFolder(strMessageFolder, True) 

     ' Process the emails attachments 
     For Each emailAttachment In emailMessage.Attachments 
      Dim fileattach As FileAttachment 
      'Dim fileattachStream As FileStream 
      Dim strAttachmentFile As String 

      ' Prepare for the downloading of the attachment 
      fileattach = emailAttachment 
      blnTryFailed = False 
      intAttempts = 0 
      strAttachmentFile = strMessageFolder & fileattach.Name 

      ' Handle up to 3 download attempts 
      Do 
       Try 
        ' Try to download the attachment - Method 1 
        fileattach.Load(strAttachmentFile) 

        ' Try to download the attachment - Method 2 
        'fileattachStream = New FileStream(strAttachmentFile, FileMode.OpenOrCreate, FileAccess.ReadWrite) 
        'fileattach.Load(fileattachStream) 
        'fileattachStream.Close() 
        'fileattachStream.Dispose() 

        blnTryFailed = False 

       Catch ex As Exception 
        blnTryFailed = True 

        ' Ensure the failed download is deleted 
        Call FileSystem_DeleteFile(strAttachmentFile) 

        intAttempts += 1 

       End Try 

      Loop While blnTryFailed And intAttempts < 3 

      ' If the attachment download was unsuccessful then we cannot process the current email 
      If blnTryFailed = True Then 
       emailMessage.IsRead = False 
       'message.Subject = message.Subject & " - Attachment download failed, skipped" 
       Try 
        emailMessage.Update(ConflictResolutionMode.AutoResolve) 
       Catch ex As Exception 
        Call Logging_Add("Unable to mark email as skipped", strMessageID, "Debug") 
       End Try 
       Exit Sub 
      End If 

Comme mentionné précédemment, je suis au courant de l'étranglement d'échange mais ne peut pas trouver quoi que ce soit lié à la vitesse quelles pièces jointes sont téléchargées. Donc, ma question est de savoir ce qui pourrait provoquer des vitesses de téléchargement si lentes?

Répondre

1

J'ai le même problème avec mon application. Le problème a été provoqué par le paramètre EWS par défaut qui écrit dans Console tous les messages HttpRequest et HttpResponse entre EWS et l'application. Désactiver TraceFlags était une bénédiction. Mon code dans C#:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2); 
service.TraceFlags = TraceFlags.None; 
Questions connexes