3

WCFメソッドがあるとしましょう

[OperationContract]
bool UploadFile(Stream stream);

で Seek 機能を取得するにはどうすればよいstreamですか?

私は2つの要件のためにそれを必要とします:

  1. ストリームの最初の 4 バイトを読み取って、ファイルの種類に50 4B 03 04ZIP ファイル署名があるかどうかを判断し、巻き戻します ( stream.Seek(0, SeekOrigin.Begin))
  2. ストリームからDotNetZipを読み取るIonic.Zip.ZipFile: ZipFile zip = ZipFile.Read(stream)(ストリームをシーク可能にする必要があります)
4

3 に答える 3

2

CodeCaster が述べたように、WCF ストリームをシークすることはできません。別のアプローチを使用して問題を解決する必要があります。

  1. ストリームのヘッダーを調べるには、ストリームの最初の 4 バイトを読み取り、次のような方法を使用して、元の WCF ストリームの最初の 4 バイトと残りの部分ConcatenatedStreamを連結します。MemoryStreamこれは基本的にストリームの一部をバッファリングしますが、連結されたストリームはシークを必要とせずに位置 0 にあるストリームを表示します。

  2. DotNetZip にシーク機能が必要な場合は、ファイルの任意の部分にアクセスできる必要があります。WCF ストリーム全体を MemoryStream に読み込み、それを DotNetZip に提供する必要があります。より効率的な代替手段はStream、要求された最高のストリーム位置までのみバッファリングする独自のラッパー クラスを作成することです。これにより、DotNetZip がファイルの最初のメガバイトのみをシークする場合、1 メガバイトのみをバッファリングします。のデータ (50 GB ファイル全体ではありません)。

于 2012-07-11T14:10:14.790 に答える
2

WCF でストリームをシークできないと主張するさまざまな 情報源を見つけました。

最終的にデータがネットワーク ソケットを介して送信されるため、これはそうであると考えられます。これは、設計上、シークをサポートしていません (バイト配列を送信するだけです)。

于 2012-07-11T13:45:41.373 に答える
0
MemoryStream ms = new MemoryStream();
request.FileByteStream.CopyTo(ms);
s.Position = 0;
var zip = Ionic.Zip.ZipFile.Read(ms)

行ごとのコード説明

  1. 動作するzipライブラリ用の新しいmemorysteamを作成します
  2. http 要求バイトストリーム「要求」からメモリストリームにコピーします
  3. 現在、ストリーム位置はコピーのためにストリームの最後にあるため、開始位置に戻ってシークします
  4. 実際にメモリストリームで zip を呼び出して完了

ionic zip はストリームでの直接作業をサポートしていないため、この追加の手順が必要です。

于 2015-08-30T12:29:34.983 に答える