none
бесконечный стриминг в WCF RRS feed

  • Общие обсуждения

  • Здравствуйте

    Разбираюсь со стримингом (это исследовательский проект), открыть стрим и переслать клиенту проблем нет, но никак не получается сделать следующее: хочу открыть стрим и передать его клиенту, а самому постоянно в него докладывать данные.

    Что то типа потокового вещания... Это вообще возможно?

    Зачем нужно - если читать порциями byte[] или применять Callbacks - то каждая такая порция будет обертываться большим по размеру xml - ведь у нас же SOAP. То есть значительная часть трафика - служебная инфраструктура обеспечения передачи данных

    А у нас в проектах требование высокой скорости передачи данных и минимальный размер трафика. Дело в том, что есть клиенты, которые до сих пор на модеме сидят, а данных хотят много и без задержек.

    Было бы классно использовать отработанную технологию WCF с его инфраструктурой, но часть данных гнать напрямую как поток байтов. Тем более что стриминг почти так и работает. А что порции буфферизируются - так нестрашно, буфер не большой

    На всякий случай подчеркну: проблема не в том, что стрим не передается (он отлично передается), а в том, что я хочу постоянно в него что нибудь на стороне сервера дописывать, а у клиентов эти дописывания читать

    вот ошибка при попытке доступа из таймера к стриму:
    Цитата
    System.ObjectDisposedException was unhandled by user code Message="Cannot access a closed Stream."



    Вот код (настройка через конфиги, биндинг NetTcpBinding, Streaming включен):
    // сервер
    001.using System;
    002.using System.IO;
    003.using System.ServiceModel;
    004.using System.Text;
    005.using System.Timers;
    006. 
    007.namespace StockLibraryStreaming
    008.{
    009.[ServiceContract(SessionMode = SessionMode.Allowed)]
    010.public interface ServiceContract
    011.{
    012.[OperationContract]
    013.string GetData(int value);
    014. 
    015.[OperationContract]
    016.Stream GetSteram();
    017.}
    018. 
    019.[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
    020.public class ServiceImplementation : ServiceContract
    021.{
    022.private readonly Stream fStream;
    023.private readonly Timer fTimer;
    024. 
    025.public ServiceImplementation()
    026.{
    027.var _buffer = Encoding.ASCII.GetBytes(@"Hello, World!");
    028. 
    029.fStream = new MemoryStream();
    030.fStream.Write(_buffer, 0, _buffer.Length);
    031.fStream.Position = 0;
    032. 
    033.fTimer = new Timer(10);
    034.fTimer.Elapsed += fTimer_Elapsed;
    035.fTimer.Start();
    036.}
    037. 
    038.void fTimer_Elapsed(object sender, ElapsedEventArgs e)
    039.{
    040.var _buffer = Encoding.ASCII.GetBytes(DateTime.Now.ToString());
    041. 
    042.fStream.Write(_buffer, 0, _buffer.Length); // <-- ошибка в этой строке
    043.}
    044. 
    045.#region ServiceContract Members
    046. 
    047.public string GetData(int value)
    048.{
    049.return value.ToString();
    050.}
    051. 
    052.public Stream GetSteram()
    053.{
    054.return fStream;
    055.}
    056. 
    057.#endregion
    058.}
    059.}
    060. 
    061.// клиент
    062.using System;
    063.using System.IO;
    064.using System.Text;
    065.using System.Threading;
    066.using ConsoleClient.Srv;
    067. 
    068.namespace ConsoleClient
    069.{
    070.class Program
    071.{
    072.private static ServiceContractClient fProxy;
    073.private static Thread fThread1;
    074.private static Thread fThread2;
    075. 
    076.static void Main(string[] args)
    077.{
    078.fProxy = new ServiceContractClient();
    079. 
    080.fThread1 = new Thread(FGetInt) {IsBackground = true};
    081.fThread2 = new Thread(FGetString) {IsBackground = true};
    082. 
    083.fThread1.Start(fProxy);
    084.fThread2.Start(fProxy);
    085. 
    086.Console.ReadLine();
    087.}
    088. 
    089.private static void FGetInt(object obj)
    090.{
    091.var _proxy = (ServiceContractClient) obj;
    092.var _rnd = new Random();
    093. 
    094.while (true)
    095.{
    096.Console.WriteLine(_proxy.GetData(_rnd.Next(0, 101)));
    097.Thread.Sleep(1000);
    098.}
    099.}
    100. 
    101.private static void FGetString(object obj)
    102.{
    103.var _proxy = (ServiceContractClient)obj;
    104.Stream _stream = _proxy.GetSteram();
    105. 
    106.while (true)
    107.{
    108.var _buffer = new byte[50];
    109.int _readed = _stream.Read(_buffer, 0, _buffer.Length);
    110. 
    111.Console.WriteLine(Encoding.ASCII.GetString(_buffer, 0, _readed));
    112.Thread.Sleep(1000);
    113.}
    114.}
    115.}
    116.}
     
    
    8 июня 2011 г. 13:56

Все ответы

  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме


    Для связи [mail]
    17 июня 2011 г. 12:45
    Модератор
  • см. тут сообщение с streaming audio/video


    • Изменено Malobukv 3 сентября 2011 г. 11:33
    3 сентября 2011 г. 11:31