0

戻り値の型として Stream を介して大きなファイルを返す REST サービスがあります。ただし、ダウンロードがクライアントによってキャンセルされた場合でも、転送されたファイルの量を知る方法が必要です。このようなことを達成するための最良の方法は何でしょうか?

これまでのところ、次のことを思いつきました。

        public Message GetFile(string path)
    {
        UsageLog log = new UsageLog();

        return WebOperationContext.Current.CreateStreamResponse((stream) =>
        {
            using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                byte[] buffer = new byte[_BufferSize];
                int bytesRead = 0;
                long totalBytesRead = 0;

                while (true)
                {
                    bytesRead = fs.Read(buffer, 0, _BufferSize);

                    if (bytesRead == 0)
                    {
                        break;
                    }

                    try
                    {
                        stream.Write(buffer, 0, bytesRead);
                    }
                    catch (CommunicationException ex)
                    {
                        break;
                    }

                    totalBytesRead += bytesRead;
                }

                log.TransferCompletedUtc = DateTime.UtcNow;
                log.BytesTransferred = totalBytesRead;
            }
        },
        "application/octet-stream");
    }

このようなことを達成するための他の解決策を聞くことに興味があります。

4

0 に答える 0