電子メールメッセージの添付ファイルをダウンロードして処理し、それらを処理するためのコードを作成中です。コードは必要に応じて機能する場合もありますが、それでもいくつかの大きな問題があります。
コードが添付ファイルをローカルディスク上のファイルにロードするときはいつでも、それを行うのに非常に長い時間がかかり、ダウンロードが遅いために次の例外を除いてタイムアウトすることがよくあります。
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のスロットリングについては認識していませんが、添付ファイルのダウンロード速度に関連するものは何も見つかりません。だから私の質問は、ダウンロード速度がこのように遅くなる原因は何でしょうか?