Как получить размер принятых/переданных данных в ASP.NET?
От: feanor_ka  
Дата: 13.07.04 11:00
Оценка:
Нужно после рендеринга страницы перед ее отправлением получить размер. Метод Response.OutputStream.Length не срабатывает.
Re: Как получить размер принятых/переданных данных в ASP.NET
От: TK Лес кывт.рф
Дата: 13.07.04 11:04
Оценка: 15 (2)
Hello, "feanor_ka"
> Нужно после рендеринга страницы перед ее отправлением получить размер. Метод Response.OutputStream.Length не срабатывает.

Можно воспользоваться подменой HttpResponse.Filter и там проводить нужные вычисления
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Как получить размер принятых/переданных данных в ASP.NET
От: mogadanez Чехия  
Дата: 13.07.04 11:27
Оценка:
Здравствуйте, feanor_ka, Вы писали:

_>Нужно после рендеринга страницы перед ее отправлением получить размер. Метод Response.OutputStream.Length не срабатывает.


перегрузить Render:



 protected override void Render(HtmlTextWriter writer)
        {
            using(MemoryStream stream = new MemoryStream())
            {
                using (StreamWriter  innerWriter = new StreamWriter(stream))
                {
                    using (HtmlTextWriter htmlWriter = new HtmlTextWriter(innerWriter))
                    {                    
                        base.Render( htmlWriter );
                        htmlWriter.Flush();                        
                        stream.Seek(0, SeekOrigin.Begin);                        
                        string html = "";
                        using (StreamReader reader =   new StreamReader(stream))
                            html = reader.ReadToEnd();
                        int size =  html.Length;
                        writer.Write( html );
                    }       
                }
            } 
        }
... << RSDN@Home 1.1.3 stable >>
Re[2]: Как получить размер принятых/переданных данных в ASP.
От: TK Лес кывт.рф
Дата: 13.07.04 11:29
Оценка:
Hello, "mogadanez"
>
> _>Нужно после рендеринга страницы перед ее отправлением получить размер. Метод Response.OutputStream.Length не срабатывает.
> перегрузить Render:
>

Так ты посчитаешь количество символов на странице. Если требуется реальное количество байт отправляемых на клиента, то этот способ нужно как минимум модифицировать
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Как получить размер принятых/переданных данных в ASP.
От: mogadanez Чехия  
Дата: 13.07.04 11:43
Оценка:
Здравствуйте, TK, Вы писали:

TK>Hello, "mogadanez"

>>
>> _>Нужно после рендеринга страницы перед ее отправлением получить размер. Метод Response.OutputStream.Length не срабатывает.
>> перегрузить Render:
>>

TK>Так ты посчитаешь количество символов на странице. Если требуется реальное количество байт отправляемых на клиента, то этот способ нужно как минимум модифицировать


Если ты имеешь в виду Http заголовки — то в Response.Filter их также не будет.

а у меня в примере действительно размер надо брать у stream'a а не у строки. + надо бы кодировку учесть.
совпадение с числом полученым в Response.Filter — 100%, но кода нужно писать меньше.

    protected override void Render(HtmlTextWriter writer)
        {
            using(MemoryStream stream = new MemoryStream())
            {
                using (StreamWriter  innerWriter = new StreamWriter(stream))
                {
                    using (HtmlTextWriter htmlWriter = new HtmlTextWriter(innerWriter))
                    {                    
                        base.Render( htmlWriter );
                        htmlWriter.Flush();                        
                        stream.Seek(0, SeekOrigin.Begin);                        
                        string html = "";
                        long size = 0;
                        using (StreamReader reader =   new StreamReader(stream, HttpContext.Current.Response.ContentEncoding))
                        {
                            html = reader.ReadToEnd();
                            size =  stream.Length;
                        }
                        writer.Write( html );
                    }       
                }
            } 
        }
... << RSDN@Home 1.1.3 stable >>
Re[2]: Как получить размер принятых/переданных данных в ASP.
От: feanor_ka  
Дата: 15.07.04 08:40
Оценка:
Здравствуйте, TK, Вы писали:

TK>Hello, "feanor_ka"

>> Нужно после рендеринга страницы перед ее отправлением получить размер. Метод Response.OutputStream.Length не срабатывает.

TK>Можно воспользоваться подменой HttpResponse.Filter и там проводить нужные вычисления


я пробовал MemoryStream туда подставить — ругается
Re[4]: Как получить размер принятых/переданных данных в ASP.
От: feanor_ka  
Дата: 15.07.04 08:45
Оценка:
Дело в том что страниц очень много и контролов порядка 20... Для каждого Render перегружать не хочется .. А траффик нужно считать по всему сайту
Re[3]: Как получить размер принятых/переданных данных в ASP.
От: mogadanez Чехия  
Дата: 15.07.04 08:49
Оценка:
Здравствуйте, feanor_ka, Вы писали:

_>Здравствуйте, TK, Вы писали:


TK>>Hello, "feanor_ka"

>>> Нужно после рендеринга страницы перед ее отправлением получить размер. Метод Response.OutputStream.Length не срабатывает.

TK>>Можно воспользоваться подменой HttpResponse.Filter и там проводить нужные вычисления


_>я пробовал MemoryStream туда подставить — ругается


просто подставить нельзя... нужно делать примерно так:

public class MyResponseFilter : MemoryStream
        {
            private Stream inner_stream_;
            
            public MyResponseFilter (Stream inner_stream)
            {
                this.inner_stream_ = inner_stream;
            }
            
                      
            public override void Write(byte[] buffer, int offset, int count)
            {
                //count есть искомая величина.
                base.WriteTo(inner_stream_) ;
                
            }

        } 
        
        
        //.....
        //на странице: 
        Response.Filter = new ResponseFilter( Response.Filter );
... << RSDN@Home 1.1.3 stable >>
Re[5]: Как получить размер принятых/переданных данных в ASP.
От: TK Лес кывт.рф
Дата: 15.07.04 08:53
Оценка:
Hello, "feanor_ka"
>
> Дело в том что страниц очень много и контролов порядка 20... Для каждого Render перегружать не хочется .. А траффик нужно считать по всему сайту

Может поднять логи веб сервера?
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
поправка....
От: mogadanez Чехия  
Дата: 15.07.04 09:02
Оценка:
Здравствуйте, mogadanez, Вы писали:

учитывая пост:
Re[4]: Как получить размер принятых/переданных данных в ASP.
Автор: feanor_ka
Дата: 15.07.04



сделаем просто модуль :


 public class TrafficModule : IHttpModule, IDisposable
    {

        public void Dispose()
        {
            
        }

        public void Init( HttpApplication context )
        {
            context.BeginRequest += new EventHandler( OnRequest );
        }

        private void OnRequest( object sender, EventArgs e )
        {
            HttpApplication app = sender as HttpApplication;
            app.Response.Filter = new ResponseFilter( app.Response.Filter, app.Request.Url );
        }

        public class ResponseFilter : MemoryStream
        {
            private Stream inner_stream_;
            private Uri uri_;
            
            public ResponseFilter (Stream inner_stream, Uri uri)
            {
                this.inner_stream_ = inner_stream;
                this.uri_ = uri;
            }
            
            public override void Close()
            {
                inner_stream_.Close();
                base.Close ();
            }

            public override void Flush()
            {
                inner_stream_.Flush();
                base.Close();
            }
            
            public override void Write(byte[] buffer, int offset, int count)
            {
                //count есть искомая величина.
                    LogWriter.AddRecord(uri_, count ); // типа сообщаем "куда следует"
                inner_stream_.Write( buffer, offset, count );
                
                
            }

        } 
    }



web.config:

<httpModules>
    <add type="TestApp.TrafficModule,TestApp" name="TrafficModule" />
</httpModules>
... << RSDN@Home 1.1.3 stable >>
Re: поправка....
От: mogadanez Чехия  
Дата: 15.07.04 09:04
Оценка:
Здравствуйте, mogadanez, Вы писали:


опять накосячил.... Close и Flush перегружать не нужно.
... << RSDN@Home 1.1.3 stable >>
Re: поправка....
От: feanor_ka  
Дата: 15.07.04 09:20
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>Здравствуйте, mogadanez, Вы писали:


M> учитывая пост:

M> Re[4]: Как получить размер принятых/переданных данных в ASP.
Автор: feanor_ka
Дата: 15.07.04



M> сделаем просто модуль :



M>
M> public class TrafficModule : IHttpModule, IDisposable
M>    {

M>        public void Dispose()
M>        {
            
M>        }

M>        public void Init( HttpApplication context )
M>        {
M>            context.BeginRequest += new EventHandler( OnRequest );
M>        }

M>        private void OnRequest( object sender, EventArgs e )
M>        {
M>            HttpApplication app = sender as HttpApplication;
M>            app.Response.Filter = new ResponseFilter( app.Response.Filter, app.Request.Url );
M>        }

M>        public class ResponseFilter : MemoryStream
M>        {
M>            private Stream inner_stream_;
M>            private Uri uri_;
            
M>            public ResponseFilter (Stream inner_stream, Uri uri)
M>            {
M>                this.inner_stream_ = inner_stream;
M>                this.uri_ = uri;
M>            }
            
M>            public override void Close()
M>            {
M>                inner_stream_.Close();
M>                base.Close ();
M>            }

M>            public override void Flush()
M>            {
M>                inner_stream_.Flush();
M>                base.Close();
M>            }
            
M>            public override void Write(byte[] buffer, int offset, int count)
M>            {
M>                //count есть искомая величина.
M>                    LogWriter.AddRecord(uri_, count ); // типа сообщаем "куда следует"
M>                inner_stream_.Write( buffer, offset, count );
                
                
M>            }

M>        } 
M>    } 
M>



M>web.config:


M>
M><httpModules>
M>    <add type="TestApp.TrafficModule,TestApp" name="TrafficModule" />
M></httpModules>
M>


Классно, это что нужно
Спасибо большое
... << RSDN@Home 1.1.3 stable >>
Re: поправка....
От: feanor_ka  
Дата: 27.07.04 08:18
Оценка:
Здравствуйте, mogadanez, Вы писали:


M> сделаем просто модуль :


M>
M> public class TrafficModule : IHttpModule, IDisposable
M>    {

M>        public void Dispose()
M>        {
            
M>        }

M>        public void Init( HttpApplication context )
M>        {
M>            context.BeginRequest += new EventHandler( OnRequest );
M>        }

M>        private void OnRequest( object sender, EventArgs e )
M>        {
M>            HttpApplication app = sender as HttpApplication;
M>            app.Response.Filter = new ResponseFilter( app.Response.Filter, app.Request.Url );
M>        }

M>        public class ResponseFilter : MemoryStream
M>        {
M>            private Stream inner_stream_;
M>            private Uri uri_;
            
M>            public ResponseFilter (Stream inner_stream, Uri uri)
M>            {
M>                this.inner_stream_ = inner_stream;
M>                this.uri_ = uri;
M>            }
            
M>            public override void Close()
M>            {
M>                inner_stream_.Close();
M>                base.Close ();
M>            }

M>            public override void Flush()
M>            {
M>                inner_stream_.Flush();
M>                base.Close();
M>            }
            
M>            public override void Write(byte[] buffer, int offset, int count)
M>            {
M>                //count есть искомая величина.
M>                    LogWriter.AddRecord(uri_, count ); // типа сообщаем "куда следует"
M>                inner_stream_.Write( buffer, offset, count );
                
                
M>            }

M>        } 
M>    } 
M>



M>web.config:


M>
M><httpModules>
M>    <add type="TestApp.TrafficModule,TestApp" name="TrafficModule" />
M></httpModules>
M>


Тут же будет учтен только траффик .aspx страниц? А графику можно на это дело прикрутить?
... << RSDN@Home 1.1.3 stable >>
Re[2]: поправка....
От: Gollum Россия  
Дата: 27.07.04 08:25
Оценка:
Здравствуйте, feanor_ka, Вы писали:

_>Тут же будет учтен только траффик .aspx страниц? А графику можно на это дело прикрутить?


Не мучайтесь и пользуйтесь нормальной веб-статистикой. Из бесплатных awstats, из платных — webtrends.
Я не злопамятный... Просто я злой, и память у меня хорошая!
Eugene Agafonov on the .NET

Re[3]: поправка....
От: feanor_ka  
Дата: 27.07.04 08:33
Оценка:
Здравствуйте, Gollum, Вы писали:

G>Здравствуйте, feanor_ka, Вы писали:


_>>Тут же будет учтен только траффик .aspx страниц? А графику можно на это дело прикрутить?


G>Не мучайтесь и пользуйтесь нормальной веб-статистикой. Из бесплатных awstats, из платных — webtrends.


а что это и где это?? если можно...
... << RSDN@Home 1.1.3 stable >>
Re[4]: поправка....
От: mogadanez Чехия  
Дата: 27.07.04 08:37
Оценка:
Здравствуйте, feanor_ka, Вы писали:


_>а что это и где это?? если можно...


в Гугле
Re[4]: поправка....
От: Gollum Россия  
Дата: 27.07.04 08:38
Оценка:
Здравствуйте, feanor_ka, Вы писали:

_>а что это и где это?? если можно...


Awstats
Webtrends
В лучших книгах всегда нет имен, и в лучших картинах — лиц
Eugene Agafonov on the .NET

Re[5]: поправка....
От: feanor_ka  
Дата: 27.07.04 08:48
Оценка:
Здравствуйте, Gollum, Вы писали:

G>Здравствуйте, feanor_ka, Вы писали:


_>>а что это и где это?? если можно...


G>Awstats

G>Webtrends


сЫЫЫпасибо
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.