[C#] Gzip compression werkt niet.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil mijn site compressen, maar de bestanden die ik compress worden als onleesbare code gerenderd.
Dat doe ik met de volgende HTTPHandler:

code:
1
2
3
4
5
6
7
8
9
10
11
public void Init(HttpApplication application)
        {
            application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
        }
        
        private void Application_BeginRequest(Object source, EventArgs e)
        {
            HttpContext context = HttpContext.Current;
            context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
            HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip"); HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;
        }


In de css en js bestanden staat niet veel bijzonders.
Als test heb ik in de js bestanden alleen onderstaand geplaatst.
code:
1
2
3
4
5
6
//js1
document.write("<p>dit is js1</p>");
en

//js2
document.write("<p>dit is js2</p>");


Wanneer ik mijn site nu lokaal run dan staat in de css en js rommel dat niet gelezen kan worden.
Q�:n*��h�_<���ϒ3*x�Q�s�3���"��4$�Ր��dN�Bg'. Found unclosed string '"9=w��^g�����[��%)T�X����4}8'. Found unclosed string ''���{��DG��=+�rތ�*����ϫ��t�$�z��V�FMQG˪#�����-V<̻�����O��?����� �MR����%��8����*deYUK��uI� Y�us�cB�=E��B���`�m���a=�_g��<���1b�S��8����3���1踪 W0?�*��ͳ�j�M���;w@l4>y����r��3���v�v�z~'. Found unclosed string ''p���f}Q;������,�hOM�{.F'.

Ik zie niet in wat ik over het hoofd zie.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waar komt die "Found unclosed string" vandaan? Iets zegt me dat dit niet de letterlijke output is maar dat dit uit een "validator" oid komt. Kun je de output eens helemaal dumpen, inclusief HTTP headers? Gebruik daarvoor een tool als Firebug, Fiddler of Wireshark.

[ Voor 48% gewijzigd door RobIII op 19-11-2010 10:49 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Misschien niet de C#-oplossing voor je probleem, maar je kunt HTTP compression toch gewoon via IIS afhandelen?

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op vrijdag 19 november 2010 @ 10:46:
Waar komt die "Found unclosed string" vandaan? Iets zegt me dat dit niet de letterlijke output is maar dat dit uit een "validator" oid komt. Kun je de output eens helemaal dumpen, inclusief HTTP headers? Gebruik daarvoor een tool als Firebug, Fiddler of Wireshark.
Dit kwam uit de console tab van firebug.

HTTP Header van de aspx:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Response Headersview source
Server  ASP.NET Development Server/9.0.0.0
Date    Fri, 19 Nov 2010 09:52:47 GMT
X-AspNet-Version    2.0.50727
Content-Encoding    gzip
Cache-Control   private
Content-Type    text/css
Content-Length  4416
Connection  Close
Request Headersview source
Host    localhost:1698
User-Agent  Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729)
Accept  text/css,*/*;q=0.1
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  115
Connection  keep-alive
Referer http://localhost:1698/WebForm1.aspx?


Output
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>

</title><link rel="stylesheet" href="/includes/css/wire-tbi.css" type="text/css" media="screen" />
     <script src="/includes/js/JScript1.js" type="text/javascript" defer="defer"></script>
     <script src="/includes/js/JScript2.js" type="text/javascript" defer="defer"></script>
</head>
<body>
    <form name="form1" method="post" action="WebForm1.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTIwNjAyODU4M2Rk8tMcjlaiTIpPzj+yVxwMjNGNE4o=" />
</div>

    <div>
     Dit is een test
      <a href="Default.aspx">Link2</a>
      <a href="Default.aspx">Link1</a>
    </div>
    </form>
</body>
</html>


css
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Server  ASP.NET Development Server/9.0.0.0
Date    Fri, 19 Nov 2010 09:52:47 GMT
X-AspNet-Version    2.0.50727
Content-Encoding    gzip
Cache-Control   private
Content-Type    text/css
Content-Length  4416
Connection  Close
Request Headersview source
Host    localhost:1698
User-Agent  Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729)
Accept  text/css,*/*;q=0.1
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  115
Connection  keep-alive
Referer http://localhost:1698/WebForm1.aspx?


en hierbij een gedeelte van de output van de css

code:
1
2
3
‹&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;í&frac12;`I–%&/mÊ{JõJ×àt¡€`$ؐ@ìÁˆÍæ’ìiG#)«*ÊeVe]f@Ìí&frac14;÷Þ{ï&frac12;÷Þ{ï&frac12;÷º;N'÷ßÿ?\fdlöÎJÚÉž!€ªÈ?~|?"þÇ¿÷ü“»ßJ?Ï—y]LÓ×íuY,/ÒoÝý“ß8™T³ëß8ùÅ¿q’Òs^-ÛíólQ”׏ÒË&frac14;žeËl”fu‘•£tž——y[Lé“&[6Û
A;?ô^lŠäÒO÷Æ÷÷Ô:|·M:ËϳuÙr‹-Ò¶JwwVï&cedil;&frac14;;­Êª~”þø?
p’Mß^ÔÕz9Û6ß?Ø=øôá=@v_ÒÇ»§÷<|ÈVå,ÔÕaÖ&curren;üø-·Õ¶iäyVo_Ô٬ȗíV[­FFºó»Óï{>=H÷wñǃÙäa~~ºÏßì<˜N3B

Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

Dat lijkt alsof daar ook een HTML encoding overheen is gegaan (al die &escapes).

Je kan ook gewoon even handmatig een request doen op je server via http://www.gidnetwork.com/tools/gzip-test.php om te kijken of het werkt :)

-niks-


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
MLM schreef op vrijdag 19 november 2010 @ 11:59:
Dat lijkt alsof daar ook een HTML encoding overheen is gegaan (al die &escapes).
Dat heeft 't forum (denk ik) gedaan.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Cloud schreef op vrijdag 19 november 2010 @ 10:47:
Misschien niet de C#-oplossing voor je probleem, maar je kunt HTTP compression toch gewoon via IIS afhandelen?
Waar je niet altijd toegang toe hebt bij shared hosting :) Je kan ook eea instellen via de machine.config

TS: Weet je zeker dat je geen exception krijgt, die exceptionpage gezip-wordt (vandaar die tekens) maar je browser er vervolgens niets van snapt en je dus die tekens op je scherm krijgt?

Verder mis ik nog de ondersteuning voor deflate en de check of de encoding wel gzip en / of deflate ondersteunt.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
gorgi_19 schreef op vrijdag 19 november 2010 @ 19:09:
[...]

Waar je niet altijd toegang toe hebt bij shared hosting :) Je kan ook eea instellen via de machine.config

TS: Weet je zeker dat je geen exception krijgt, die exceptionpage gezip-wordt (vandaar die tekens) maar je browser er vervolgens niets van snapt en je dus die tekens op je scherm krijgt?

Verder mis ik nog de ondersteuning voor deflate en de check of de encoding wel gzip en / of deflate ondersteunt.
Dat is inderdaad de reden dat ik het zelf wil doen.
N.a.v. jou opmerkingen heb ik de code aangepast:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class CompressionModule : IHttpModule
    {       
        private const string GZIP = "gzip";       
        private const string DEFLATE = "deflate";  
       
        public void Init(HttpApplication application)
        {
            application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
        }

      
        private void Application_BeginRequest(Object source, EventArgs e)
        {
            try
            {
                HttpContext context = HttpContext.Current;
                Compress(context);
            }
            catch(Exception ex)
            {
                throw new ArgumentException(ex.Message);
            }
        }

      
        public static void Compress(HttpContext context)
        {
            string ext = Path.GetExtension(context.Request.Path);
            if (context != null)
            {
                if (IsEncodingAccepted(DEFLATE))
                {
                    context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress);
                    SetEncoding(DEFLATE);
                }
                else if (IsEncodingAccepted(GZIP))
                {
                    context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
                    SetEncoding(GZIP);
                }
            }
        }
       
        private static bool IsEncodingAccepted(string encoding)
        {
            return HttpContext.Current.Request.Headers["Accept-encoding"] != null && HttpContext.Current.Request.Headers["Accept-encoding"].Contains(encoding);
        }

      
        private static void SetEncoding(string encoding)
        {
            HttpContext.Current.Response.AppendHeader("Content-encoding", encoding);
            HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;
        }

        public void Dispose()
        {

        }
    }


Middels string ext = Path.GetExtension(context.Request.Path); zie ik wat er langs komt.
Dat is 1xaspx 2x css en 2x js.
Wanneer ik nu de website run dan wordt de pagina goed geladen.
Wanneer ik op een link klik die gewoon verwijst naar /default.aspx dan krijg ik diezelfde fouten in js en css.
Ik ben middels debugging door de compressmodule gegaan, maar er treedt nergens een fout op.
Voor mij is het een ri ra raadsel 8)7

Hierbij de code (project bestaat uit 1 aspx 2x css 2x js en 1 httpmodule)
http://wtrns.fr/hgfL4FPC42TYDg

[ Voor 1% gewijzigd door Verwijderd op 21-11-2010 15:53 . Reden: Project toegevoegd voor degene die zich geroepen voelt er naar te kijken ;-) ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
MLM schreef op vrijdag 19 november 2010 @ 11:59:
Dat lijkt alsof daar ook een HTML encoding overheen is gegaan (al die &escapes).

Je kan ook gewoon even handmatig een request doen op je server via http://www.gidnetwork.com/tools/gzip-test.php om te kijken of het werkt :)
Ik heb de code nog nagekeken en er zit verder geen html encoding o.i.d. in.
Handige site, maar dit kan je ook nakijken in firebug of Chrome.

Inmiddels werkt het als ik in chrome bekijk. Alles wordt netjes Gzip compressed.
Kijk ik in firefox/firebug dan toont deze de 1e x goed, klik ik op een link dan krijg ik weer dezelfde output en is dus de styling en js niet beschikbaar.

Wanneer ik op de link klik in IE en Chrome dan gaat hij maar 1x door de httphandler voor de aspx en niet meer voor de css en js. In Firefox gaat hij wel voor elk item door de httphandler, waarna het fout gaat.

Dat het in Chrome goed gaat en firefox niet heeft te maken met caching. In Chrome stond caching aan.

[ Voor 37% gewijzigd door Verwijderd op 24-11-2010 08:16 ]

Pagina: 1