WCF を使用して、信頼性の低い接続を介してコンピューター間で大きなファイルを転送する必要があります。
ファイルを再開できるようにしたいのですが、WCF によってファイルサイズが制限されたくないので、ファイルを 1 MB にチャンクしています。これらの「チャンク」はストリームとして転送されます。これまでのところ、これは非常にうまく機能します。
私の手順は次のとおりです。
- ファイルストリームを開く
- ファイルからバイト[]にチャンクを読み取り、メモリストリームを作成します
- 転送チャンク
- 2.に戻り、ファイル全体が送信されるまで
私の問題はステップ 2 にあります。バイト配列からメモリ ストリームを作成すると、最終的に LOH になり、メモリ不足の例外が発生すると思います。私は実際にこのエラーを作成できませんでした。私の仮定が間違っている可能性があります。
ここで、メッセージで byte[] を送信したくありません。WCF から配列のサイズが大きすぎることが通知されるからです。最大許容配列サイズおよび/またはチャンクのサイズを変更できますが、別の解決策があることを願っています。
私の実際の質問:
- 私の現在のソリューションは LOH にオブジェクトを作成しますか?それによって問題が発生しますか?
- これを解決するより良い方法はありますか?
ところで、受信側では、受信したストリームから小さなチャンクを単純に読み取り、ファイルに直接書き込むので、大きなバイト配列は必要ありません。
編集:
現在の解決策:
for (int i = resumeChunk; i < chunks; i++)
{
byte[] buffer = new byte[chunkSize];
fileStream.Position = i * chunkSize;
int actualLength = fileStream.Read(buffer, 0, (int)chunkSize);
Array.Resize(ref buffer, actualLength);
using (MemoryStream stream = new MemoryStream(buffer))
{
UploadFile(stream);
}
}