2

電子メールメッセージの添付ファイルをダウンロードして処理し、それらを処理するためのコードを作成中です。コードは必要に応じて機能する場合もありますが、それでもいくつかの大きな問題があります。

コードが添付ファイルをローカルディスク上のファイルにロードするときはいつでも、それを行うのに非常に長い時間がかかり、ダウンロードが遅いために次の例外を除いてタイムアウトすることがよくあります。

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

私は間違っているかもしれませんが、問題のExchangeサーバーがコードを実行しているサーバーと同じギガビットネットワーク上にあり、Outlookが電子メールや添付ファイルなどに高速にアクセスできる場合、添付ファイルはダウンロードよりもかなり速く、はるかに一貫してダウンロードされます。ダウンロード/ロード時間の例を次に示します。

  • 800KBジップ-1分4秒
  • 840KBZip-6分18秒
  • 1.33MBジップ-11分23秒
  • 2.78MB Zip-17m 3s

EWS接続タイムアウト設定をデフォルトの100000msではなく300000msに設定して、添付ファイルのダウンロード時間を増やし、例外の数をわずかに減らしましたが、待機時間が長すぎます。

コードはスレッドで実行され、一度に8つまでしか実行されません(10は私が信じるEWSのスロットル制限です)が、それが大きな違いを生むとは想像できません。(一度に1通の電子メールをテストしているときは実行されていません)。

添付ファイルをダウンロードするスレッドコードは次のとおりです(簡単にするために、いくつかの無関係なビットは削除されています)。

        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

前述のように、Exchangeのスロットリングについては認識していませんが、添付ファイルのダウンロード速度に関連するものは何も見つかりません。だから私の質問は、ダウンロード速度がこのように遅くなる原因は何でしょうか?

4

1 に答える 1