This is a severe problem in my application for some months with out finding any good solution. I noticed that C# manage the way Stream class is streaming in WCF, without considering my configuration.
首先,我有一个从FileStream继承的班级, 这样我就可以随时看从客户方面读到现在的读数:
public class FileStreamWatching : FileStream
{
/// <summary>
/// how much was read until now
/// </summary>
public long _ReadUntilNow { get; private set; }
public FileStreamWatching(string Path, FileMode FileMode, FileAccess FileAccess)
: base(Path, FileMode, FileAccess)
{
this._ReadUntilNow = 0;
}
public override int Read(byte[] array, int offset, int count)
{
int ReturnV = base.Read(array, offset, count);
//int ReturnV = base.Read(array, offset, count);
if (ReturnV > 0)
{
_ReadUntilNow += ReturnV;
Console.WriteLine("Arr Lenght: " + array.Length);
Console.WriteLine("Read: " + ReturnV);
Console.WriteLine("****************************");
}
return ReturnV;
}
}
Secondly, below is my service method of reading the client s stream that contain the file. My main problem is that FileStreamWatching.Read does not start for each time I summon it from this method below, instead FileStreamWatching.Read start one time for each X times I call it.. Strange.
+++%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%++%++%++%+%+%+%+%+%+%+%++++++%++%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public void Get_File_From_Client(Stream MyStream)
{
using (FileStream fs = new FileStream(@"C:Upload" + "Chat.rar", FileMode.Create))
{
byte[] buffer = new byte[1000];
int bytes = 0;
while ((bytes = MyStream.Read(buffer, 0, buffer.Length)) > 0)
{
fs.Write(buffer, 0, bytes);
fs.Flush();
}
}
}
< 坚固> 这是每次 FileStream Watching 时客户端的输出。 读被激活 : (remmber the Suide lenght is only 1000!) 坚固]
Arr Lenght: 256, Read: 256
Arr Lenght: 4096, Read: 4096
Arr Lenght: 65536, Read: 65536
Arr Lenght: 65536, Read: 65536
Arr Lenght: 65536, Read: 65536
Arr Lenght: 65536, Read: 65536
...直到文件传送完成为止
<强 > 问题: 强>
- The Lenght of the buffer I brought to the read method isnt 256/4096/65536. It is 1000.
- The Read from the FileStreamWatching class does not start each time I call it from the service.
我的目标:强>
控制我从客户那里 了解到每个读者的读数
我每次在服务处打电话时 都会开始阅读
<强> 我的客户端配置: 强>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IJob" transferMode="Streamed"/>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8080/Request2" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IJob" contract="ServiceReference1.IJob"
name="BasicHttpBinding_IJob" />
</client>
</system.serviceModel>
</configuration>
<% 1> 我的服务配置 % 1> (这里没有配置文件) :
BasicHttpBinding BasicHttpBinding1 = new BasicHttpBinding();
BasicHttpBinding1.TransferMode = TransferMode.Streamed;
//
BasicHttpBinding1.MaxReceivedMessageSize = int.MaxValue;
BasicHttpBinding1.ReaderQuotas.MaxArrayLength = 1000;
BasicHttpBinding1.ReaderQuotas.MaxBytesPerRead = 1000;
BasicHttpBinding1.MaxBufferSize = 1000;
//
ServiceHost host = new ServiceHost(typeof(JobImplement), new Uri("http://localhost:8080"));
//
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
//
host.Description.Behaviors.Add(behavior);
ServiceThrottlingBehavior throttle = new ServiceThrottlingBehavior();
throttle.MaxConcurrentCalls = 1;
host.Description.Behaviors.Add(throttle);
//
//
host.AddServiceEndpoint(typeof(IJob), BasicHttpBinding1, "Request2");
host.Open();