2

まず第一に、私は問題をできるだけ単純にして、wcf でストリーム オブジェクトを転送するとき、メソッド 'Read' は私が彼に与えたパラメータを気にしないことを簡単に説明します。

WCF クライアントとサービス、TransferMode = Streamed が両側にあります。basicHttpBinding. クライアントはサービスに Stream オブジェクトを送信し、サービスはストリームを読み取り、作成した新しいファイルに書き込みます。クライアントは、私が作成したストリームのサブクラスを送信します: FileStreamを継承するFileStreamExです。

サービスが「Read」メソッドを呼び出すたびに監視できるように、このクラスをその名前空間に配置しました。

namespace ConsoleApplication1
{
    /// <summary>
    /// The only thing I gain from this class is to know how much was read after every time I call "Read" method
    /// </summary>
    public class FileStreamEx : FileStream
    {
        /// <summary>
        /// how much was read until now
        /// </summary>
        public long _ReadUntilNow { get; private set; }
        public FileStreamEx(string path, FileMode mode, FileAccess access, FileShare share)
            : base(path, mode, access, share)
        {
            this._ReadUntilNow = 0;
        }
        public override int Read(byte[] array, int offset, int count)
        {
            int ReturnV = base.Read(array, offset, count);
            _ReadUntilNow += ReturnV;
            Console.WriteLine("Read: " + _ReadUntilNow);//Show how much was read until now
            return ReturnV;
        }
    }
    public class Program
    {
        static void Main(string[] args)
        {
            ServiceReference1.IJob Service1 = new ServiceReference1.JobClient();
            string FileName = "Chat.rar";
            string Path = @"C:\Uploadfiles\";
            FileStreamEx TheStream = new FileStreamEx(Path + FileName, FileMode.Open, FileAccess.Read, FileShare.None);
            Service1.UselessMethod1(TheStream);
        }
    }
}

これまでのところ、複雑なことは何もありません。以下は UselessMethod1 メソッド コードです。しかし、その前に、問題はすでに始まっています: Service1.UselessMethod1(TheStream) を呼び出した後、UselessMethod1 メソッドに行く代わりに、ファイルのサイズと出力が (クライアント側のみ):

読む: 256

読み取り: 4352

読み取り: 69888

そして、'Read' メソッドが 3 回呼び出された後にのみ、 UselessMethod1 Begin . 以下のコードを見ると、My buffer arr size が Read ごとに 1024 しかないことがわかります! 論理的には、MyStream.Read(buffer, 0, bufferSize)) の後、私の「読み取り」メソッドを開始する必要がありますが、そうではなく、「読み取り」メソッドがランダムに開始されます(または理解できない)。 「Read」メソッドの開始、「Read」メソッドが持つパラメータ「byte[] array」の Arr の長さは、呼び出されたときに 1024 になることはありません。

public void UselessMethod1(Stream MyStream)
        {
            using (FileStream fs = new FileStream(@"C:\Upload\"+"Chat.rar", FileMode.Create))
            {
                int bufferSize = 1024 ;
                byte[] buffer = new byte[bufferSize];
                int totalBytes = 0;
                int bytes = 0;
                while ((bytes = MyStream.Read(buffer, 0, bufferSize)) > 0)
                {
                    fs.Write(buffer, 0, bytes);
                    fs.Flush();
                    totalBytes += bytes;
                }
            }
        }

このコードの出力の一部は次のとおりです

しかし、私の論理では、このコードの出力は最初から必要です。

読み取り: 1024

読み取り: 1024

読み取り: 1024

読み取り: 1024

読み取り: 1024

読み取り: 1024

...

..

.

しかし、アウトアウトではありません!私の間違いはどこですか?ミスケートさえありますか?

4

1 に答える 1

1

サーバーとクライアントは、データを読み取るときに異なるバッファー サイズを使用する場合があります (おそらく使用する可能性があります)。コード自体に問題はありません。

クライアントにより小さいバッファを強制的に使用させたい場合は、バインディングの転送モードを作成し、バインディングのプロパティにStreamed小さな値を使用することを検討できMaxBufferSizeます (カスタム バインディングを使用している場合、これらのプロパティはおそらくトランスポート バインディング要素)。

于 2012-05-14T15:57:52.833 に答える