WCF Streaming - Ограничение скорости

Это серьезная проблема в моем приложении в течение нескольких месяцев без какого-либо хорошего решения. Я заметил, что С# управляет потоковой передачей класса Stream в WCF без учета моей конфигурации.

Во-первых, у меня есть класс, наследуемый от 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;
        }
    }

Во-вторых, ниже мой сервисный метод чтения клиентского потока, содержащего файл. Моя основная проблема заключается в том, что FileStreamWatching.Read не запускается каждый раз, когда я вызываю его из этого метода ниже, вместо этого FileStreamWatching.Read запускается один раз для каждого X раз, когда я его вызываю. Странно.

* Посмотрите вывод позже.

    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();
            }
        }
    }

Это вывод на стороне клиента каждый раз, когда активируется FileStreamWatching.Read: (Помните, что длина буфера всего 1000!)

Длина массива: 256 , Чтение: 256


Обр. Длина: 4096, Чтение: 4096


Длина обр.: 65536, Чтение: 65536


Длина обр.: 65536, Чтение: 65536


Длина обр.: 65536, Чтение: 65536


Длина обр.: 65536, Чтение: 65536


....Пока не завершится перенос файла.

Проблемы:

  1. Длина буфера, который я передал методу чтения, не равна 256/4096/65536. Это 1000.
  2. Класс Read from FileStreamWatching не запускается каждый раз, когда я вызываю его из службы.

Мои цели:

  1. Контроль того, сколько я получаю от клиента за каждое чтение.

  2. FileStreamWatching.Read будет запускаться каждый раз, когда я вызываю его из службы.

Конфигурация моего клиента:

<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>

Конфигурация моей службы(Здесь нет файла конфигурации):

        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();
7
задан Stav Alfi 27 May 2012 в 07:55
поделиться