3

Streamクラスを使用してドキュメントをアップロードするWCFサービスがあります。

この後、ドキュメントのサイズ(ストリームの長さ)を取得して、FileSizeのfileAttributeを更新します。

しかし、これを行うと、WCFは例外をスローします

Document Upload Exception: System.NotSupportedException: Specified method is not supported.
   at System.ServiceModel.Dispatcher.StreamFormatter.MessageBodyStream.get_Length()
   at eDMRMService.DocumentHandling.UploadDocument(UploadDocumentRequest request)

誰かがこれを解決するのを手伝ってくれますか?

4

2 に答える 2

6

この後、ドキュメントのサイズ(ストリームの長さ)を取得して、FileSizeのfileAttributeを更新します。

いいえ、そうしないでください。ファイルを書き込んでいる場合は、ファイルを書き込むだけです。最も単純な場合:

using(var file = File.Create(path)) {
    source.CopyTo(file);
}

または4.0より前:

using(var file = File.Create(path)) {
    byte[] buffer = new byte[8192];
    int read;
    while((read = source.Read(buffer, 0, buffer.Length)) > 0) {
        file.Write(buffer, 0, read);
    }
}

(事前に長さを知る必要はありません)

一部のWCFオプション(完全なメッセージセキュリティなど)では、処理前にメッセージ全体を検証する必要があるため、実際にストリーミングすることはできません。したがって、サイズが大きい場合は、代わりに、クライアントがメッセージを分割して送信するAPIを使用することをお勧めします。分割して(サーバーで再アセンブルします)。

于 2012-08-07T15:10:53.463 に答える
0

ストリームがシークをサポートしていない場合は、を使用してその長さを見つけることができませんStream.Length

別の方法は、ストリームをバイト配列にコピーして、その累積長を見つけることです。これには、最初にストリーム全体を処理することが含まれます。これが不要な場合は、ストリーム長パラメーターをWCFサービスインターフェイスに追加する必要があります。

于 2012-08-07T14:52:50.760 に答える