3

Zip ファイル (50MB) を含むバイト配列を要求したクライアントに返す WCF サービスがあります。Zip が非常に小さい (1 MB など) 場合、SOAP 応答はバイト配列が埋め込まれた WCF から送信されます。しかし、1MB のファイルでも応答サイズは非常に大きくなります。50MB のファイルを転送しようとすると、SOAP 応答のサイズが大きくなるため、サービスがハングし、メモリ不足の例外がスローされます。

  1. バイト配列を送り返すときに、WCF / Web サービスで大きなファイル (主に ZIP 形式) を転送するための最良のオプションは何ですか。ファイルを返送する代わりに、何か良い方法はありますか?

  2. WCF / Web サービスが大きなファイルを任意のクライアントに転送するための最良の方法であるかどうか、または 10,000 ユーザーの相互運用性とスケーラビリティを達成できるように利用可能な他のより良いオプション/テクノロジはありますか?

私のCコードは以下です:

        String pathfordownload = @"D:\New Folder.zip";
        FileStream F2D = new FileStream(pathfordownload, FileMode.Open,FileAccess.Read);
        BinaryReader binReader = new BinaryReader(F2D);
        binReader.BaseStream.Position = 0;
        byte[] binFile = binReader.ReadBytes(Convert.ToInt32 (binReader.BaseStream.Length));
        binReader.Close();
        return binFile;

私は Google で利用可能なすべてのデータに苦労しており、先週は良い結果が得られなかったので、実用的な/実際の情報は非常に役立ちます.

4

2 に答える 2

4

WCFを介してストリームを転送してから、(ほぼ)無制限の長さのファイルを送信できます。

于 2010-07-21T13:07:18.897 に答える
2

私はまったく同じ問題に直面しました。バイト配列を使用しているため、メモリ不足は避けられません。

私たちが行ったことは、ハード ドライブ上のデータをフラッシュすることでした。そのため、仮想メモリによって制限される代わりに、同時トランザクションの容量が HD スペースになります。

次に、転送のために、ファイルを他のコンピューターに配置しました。もちろん、私たちの場合はサーバーからサーバーへのファイル転送でした。ピアから切り離したい場合は、http でのファイル ダウンロードを使用できます。

そのため、ファイルで応答する代わりに、サービスはファイルの場所への http URL で応答できます。次に、クライアントが標準の HttpRequest または WebClient を使用してサーバーから正常にダウンロードされると、メソッドを呼び出してファイルを削除します。SOAP では Delete(string url)、REST ではリソースの削除メソッドになります。

これがあなたにとって理にかなっていることを願っています。これの最も重要な部分は、スケーラブルなソフトウェアでは、特に 10000 クライアント (同時?) を見ている場合、メモリ ストリームやバイト配列などの限られたリソースを使用できないことを理解することです。しかし、最終的には SAN に配置され、IT 部門が必要に応じてパーティションを拡張できるハード ドライブ パーティションなど、大規模で簡単に拡張できるリソースに依存する必要があります。

于 2010-07-21T13:32:17.733 に答える