ImはWCFとクライアントコード内で開発しています。サービスに転送するファイルをファイルストリームで作成します(メッセージでストリームとして送信する)。サービスがストリームを取得した後、彼は平和でそれを読んで、新しいファイルに書き込む。サービスはクライアントから彼にファイルをダウンロードします。私はFileStreamがファイルをメモリにロードする理由を理解しています
ファイルストリームのメソッド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の値=ファイルのサイズを読み始めることさえあるということです。これをヘプテンドにするための唯一の方法は、私の優先メソッドを呼び出すことです。
私の質問は、誰かが私にそれを防ぐために何をすればよいのですか?
私のクライアント:
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のクラス:そこにあるサイドAの 、:
[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;
}
}
}
うん...何ですか?サービスコールの反対側で内部的に起こっている情報を知りたいと思うようです... – Tejs
私はストリームオブジェクトの参照を渡すので、私は知ることができます。 –
あなたはもっと明確になりますか? 「誰か」は誰ですか?どのように読み込みを呼びますか? –