Đây là một vấn đề nghiêm trọng trong ứng dụng của tôi trong một vài tháng với việc tìm ra bất kỳ giải pháp tốt nào. Tôi nhận thấy rằng C# quản lý cách lớp Dòng đang phát trực tuyến trong WCF, mà không xem xét cấu hình của tôi.WCF Streaming - Giới hạn tốc độ
Thứ nhất, tôi có một lớp kế thừa từ FileStream để tôi có thể xem có bao nhiêu đã được đọc cho đến nay từ phía khách hàng bất cứ lúc nào:
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;
}
}
Thứ hai, dưới đây là phương pháp dịch vụ của tôi đọc dòng của khách hàng có chứa tệp. Vấn đề chính của tôi là FileStreamWatching.Read không bắt đầu cho mỗi lần tôi triệu hồi nó từ phương thức này bên dưới, thay vào đó FileStreamWatching.Read bắt đầu một lần cho mỗi lần X tôi gọi nó .. Lạ.
* Nhìn vào ra đặt sau
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();
}
}
}
Đây là sản lượng tại phía khách hàng cho mỗi lần FileStreamWatching.Read được kích hoạt: (Remmber chiều dài đệm được chỉ có 1000!)
Giờ đến Chiều dài: 256, đọc: 256
Giờ đến Chiều dài: 4096, đọc: 4096
Giờ đến Chiều dài: 65536, đọc: 65536
Giờ đến Chiều dài: 65536, đọc: 65536
Giờ đến Chiều dài: 65536, Đọc: 65536
Giờ đến Chiều dài: 65536, đọc: 65536
.... Cho đến file transfare hoàn tất.
vấn đề:
- Các Chiều dài của bộ đệm I đưa đến đọc phương pháp isnt 256/4096/65536. Nó là 1000.
- Đọc từ lớp FileStreamWatching không khởi động mỗi khi tôi gọi nó từ dịch vụ.
Mục tiêu của tôi:
Controling vào bao nhiêu tôi reacive từ khách hàng đối với từng đọc.
FileStreamWatching.Read sẽ bắt đầu mỗi lần tôi gọi nó từ dịch vụ.
cấu hình Khách hàng của tôi:
<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>
cấu hình dịch vụ My (Không có tập tin cấu hình ở đây):
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();
MyStream.Read (buffer, 0, buffer.Length) - không nên thặng dư bù đắp sau mỗi cuộc gọi? – Tisho
@Tuy nhiên ứng dụng có thể thay đổi bù trừ cho mỗi cuộc gọi. Cho dù nó có hay không không ảnh hưởng đến câu hỏi của Stav vào thời điểm này trong mã. –