0

WCFで開発していて、クライアントコード内で、サービスに転送するファイルを使用してファイルストリームを作成します(メッセージ内のストリームとして送信します)。サービスがストリームを取得した後、彼はそれを平和的に読み、新しいファイルに書き込みます。サービスはクライアントから彼にファイルをダウンロードします、それだけです。

ファイルストリームのメソッドReadをオーバーライドするので、サービスがクライアント側でダウンロードされているときに、クライアント側で読み取られた量を知ることができます

public class FileStreamEx : FileStream
    {
        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;
            return ReturnV;
        }
    }

私の目標は、クライアント側から、サービスによって毎秒どれだけ読み取られたかを知ることです。これは、サービスがFileStreamExオブジェクトへの参照のみを使用するため、クライアントから_ReadUntilNow値を確認することで実装できます。

私の問題は、サービスが彼に与えたストリームの読み取りを開始する前に、_ReadUntilNow値=ファイルのサイズであるということです。これを実行する唯一の方法は、オーバーライドするメソッドであるReadを呼び出すことです。

私の質問は、誰が私のためにReadを呼び出すのか、なぜ、そしてそれを防ぐために何ができるのかということです。

私の顧客:

public static void CallService()
        {
            ServiceReference1.IJob Service1 = new ServiceReference1.JobClient(new InstanceContext(new CCBImplement()));
            DLL.FileStreamEx TheStream TheStream = new DLL.FileStreamEx(@"C:\Uploadfiles\Chat.rar", FileMode.Open, FileAccess.Read, FileShare.None);
            ServiceReference1.RemoteFile RemoteFile1=new ServiceReference1.RemoteFile("Chat.rar", TheStream.Length, @"C:\Uploadfiles\Chat.rar", TheStream);
            Service1.UselessMethod1(RemoteFile1);
            new Thread(new ThreadStart(Check_Only_ReadUntilNow_Every_Second)).Start();
        }

サービスコード:

public void UselessMethod1(RemoteFile RemoteFile)
        {
            Stream MyStream = RemoteFile.FileByteStream;
            using (FileStream fs = new FileStream(@"C:\Upload\"+RemoteFile.FileName, FileMode.Create))
            {
                int bufferSize = 1 ; // 1 MB buffer
                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;
                }
            }
        }

RemoteFileクラス:

[MessageContract]
    public class RemoteFile : IDisposable
    {
        [MessageHeader]
        public string FileName;

        [MessageHeader]
        public string Path;

        [MessageHeader]
        public long Length;

        [MessageBodyMember]
        public Stream FileByteStream;
        public RemoteFile() { }
        public RemoteFile(string FileName, string Path, long Length, Stream FileByteStream)
        {
            this.Path = Path;
            this.FileName = FileName;
            this.Length = Length;
            this.FileByteStream = FileByteStream;
        }
        public void Dispose()
        {
            if (FileByteStream != null)
            {
                FileByteStream.Close();
                FileByteStream = null;
            }
        }
    }
4

1 に答える 1

1

彼の質問は次のとおりだと思います。サイドAには、ストリームモードでファイルを読み取るメソッドを持つサービスホストがあります。サイドBには、このサービスを使用してファイルを送信するクライアントがあります。

彼はFileStreamcalssを拡張して、ファイルから読み取られたバイト数を保持する変数を追加しました。

彼はサイドAでサービスを呼び出しますが、メソッドに到達する前に、追加の変数がファイル全体のサイズを保持します。これは、ファイル全体が読み取られたことを意味します。

問題はその理由です。

于 2012-05-11T19:40:05.020 に答える