2012-04-10 14 views
2

Ich bin gerade dabei, Code zum Herunterladen und Verarbeiten der Anhänge von E-Mail-Nachrichten zu schreiben und diese dann zu verarbeiten. Der Code funktioniert in einigen Fällen wie erforderlich, weist jedoch weiterhin einige schwerwiegende Probleme auf. Exchange-Webdienste Anhangslast ist langsam

Jedes Mal, wenn der Code die Anlage in eine Datei auf der lokalen Festplatte lädt, dauert es eine sehr lange Zeit so und oft aus mit folgenden Ausnahme als Folge des langsamen Download zu tun:

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

Ich mag mich irren, aber wenn sich der betreffende Exchange-Server im selben Gigabit-Netzwerk befindet wie der Server, auf dem der Code ausgeführt wird, und Outlook schnell auf E-Mails, Anhänge usw. zugreifen kann, sollten Anhänge erheblich schneller heruntergeladen werden als sie und viel konsistenter. Hier sind einige Beispiel-Download/Ladezeiten:

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

Ich habe versucht, die Einstellung der EWS-Verbindungszeit auf 300000ms anstelle der Standard 100000ms einzustellen, um den Anhängen mehr Zeit zum Herunterladen zu geben und die Anzahl der Ausnahmen ist leicht gesunken, aber die Wartezeit ist jetzt viel zu lang.

Der Code läuft in Threads, nicht mehr als 8 zu einer Zeit (10 ist die Drosselungsgrenze für EWS glaube ich), aber ich kann mir nicht vorstellen, dass das einen großen Unterschied machen würde. (Es hat nicht getan, wenn ich einzelne E-Mails gleichzeitig getestet habe). Hier

ist der Gewinde-Code, der die Anlagen herunterlädt (einige un-bezogenen Bits der Einfachheit halber entfernt):

 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 

Wie bereits erwähnt, im, sich der Exchange-Drosselung kann aber nichts mit der Geschwindigkeit im Zusammenhang finden bei welche Anhänge heruntergeladen werden. Also meine Frage ist, was könnte solche langsamen Download-Geschwindigkeiten verursachen?

Antwort

1

Ich habe das gleiche Problem mit meiner App. Das Problem wurde durch die Standardeinstellung von EWS verursacht, die alle HttpRequest- und HttpResponse-Nachrichten zwischen EWS und Anwendung in Console schreibt. TraceFlags abzuschalten war ein Segen. Mein Code in C#:

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