1

ストリーミングされた WCF サービスがあります。1 回の操作で、アップロード用のファイルを受け取ります。私がこのようなことをしようとすると

request.FileContent.Length

次に、OperationNotSupported 例外を受け取ります。それで大丈夫です。しかし、実際に完全に転送せずにファイルサイズを取得するにはどうすればよいでしょうか? この情報を呼び出しとともにヘッダーとして送信できることはわかっていますが、この方法は使用したくありません。

WCF が maxReceiveMessageSize を通じて要求サイズを制限できる場合。同じ情報を使用してメッセージ/ストリームのサイズを確認するにはどうすればよいですか?

4

2 に答える 2

1

しかし、実際に完全に転送せずにファイルサイズを取得するにはどうすればよいですか?この情報を通話と一緒にヘッダーとして送信できることはわかっていますが、この方法は使いたくありません。

最初にバイトストリームのサイズをパイプに送信する必要があります。他の方法はありません。(とにかくそれがすべて行うであろういくつかの作り付けの方法があった場合)

ストリームの前に追加するのはそれほど複雑ではありません。

var bytes = File.ReadAllBytes("somefile.txt");
stream.Write(BitConverter.GetBytes((Int32)bytes.Length), 0,  4);
stream.Write(bytes, 0, bytes.Length);

次に、ストリームを読み取るときに反対側に:

byte[] fileLengthBytes =new byte[4];
stream.Read(fileLengthBytes, 0, 4);
int length = BitConverter.ToInt32(fileLengthBytes, 0);
//you know the size of the file now, log it or show the user
var fileBytes = new byte[length];
stream.Read(fileBytes, 0, fileBytes.Length);

これは単なるbyte[]です。ストリームが大きい場合は、バッファを作成したくない場合があります。

于 2012-08-10T13:37:16.273 に答える
1

一般に、ストリーム全体のバイト数を示すデータがストリームの先頭にない限り、またはその他の出力がない限り、すべてを読み取ってバイト数をカウントしない限り、バイト ストリームのサイズを知ることはできません。 -WCF メッセージ ヘッダーなどで、ストリームの長さを通信するためのバンドの方法。ストリームを読み取らずにサイズを知りたい場合は、ヘッダー アプローチを使用する必要があります。

WCF maxReceiveMessageSize は、受信したバイト数をカウントし、制限を超えた場合は例外をスローすることで機能します...ストリームの長さもわからないため、最初にメッセージを読み取らずにメッセージの受信を事前に防ぐことはできません。最大許容バイト数。

于 2012-08-10T13:05:12.867 に答える