我在WCF和我的客戶端代碼中開發我創建文件流以傳輸到服務(通過在消息流中發送它)文件。服務到達後,他以和平的方式閱讀和平,並將其寫入新文件;服務將文件從客戶端下載到他,這就是所有。不能理解爲什麼FileStream將文件加載到內存
我重寫了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;
}
}
我的目標是從客戶端知道,服務每秒鐘有多少人在這裏得到服務。 這可以通過簡單地從客戶端查看_ReadUntilNow值來實現,因爲該服務僅使用對FileStreamEx對象的引用。
我的問題是,該服務甚至開始讀取我給他的流,_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類:
[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
即時通訊只傳遞流對象的引用,所以我可以知道。 –
你能更清楚嗎?誰是「某人」,他們如何稱之爲「讀」? –