2012-01-07 10 views
4

作業イントラネット上のサイトでgzip圧縮を有効にしようとしています。残念ながら、私はIISにアクセスすることはできないので、私が行った変更はweb.configを介して行っています。httpModuleを使用して手動で圧縮を有効にする

サーバーでIIS 6および.NET 2.0が実行されています。

私は得ることはありませんJavaScriptとCSSファイルを除いて、うまく働いた私は、web.configファイルに登録された...

<system.web> 
    <httpModules> 
     <add name="EnableCompression" type="EnableCompression"/> 
    </httpModules> 
</system.web> 

さて、上記のHttpModuleを

public class EnableCompression : IHttpModule 
{ 
    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; 
    } 

} 

を追加することで圧縮を有効に圧縮される。私が見つけたことから、.jsと.cssをIIS 6のアプリケーションマッピングに追加する必要がありますが、もちろんそれはできません。

これは明らかにweb.configファイルで行うことができますが、その方法はわかりません。

.jsファイルと.cssファイルの圧縮を有効にするにはどうすればよいですか?

+0

コードには2つのバグがあります。まず、着信要求に 'Accept-Encoding' HTTPヘッダーが設定されているかどうかを確認し、そうであればgzipが許可された値の1つであるかどうかを確認する必要があります(フレームワークはdeflateStreamを使用してdeflateStreamもサポートします。より小さな出力)。第2に、 'VaryByHeaders'の設定は、出力キャッシュを有効にした場合にのみ有効で、指定されたヘッダで出力キャッシュを変更するようにランタイムに指示します。あなたのケースでは、 'Accept-Encoding'の異なる設定(noneを含む)ごとに、同じ圧縮ページの複数のコピーをキャッシュに格納します。 – RickNZ

+0

Thatnks、私はあなたのコメントを組み込むことを忘れないでください – SharpBarb

答えて

1

IIS6では、静的コードは管理されたHttpModulesで処理されません。ネイティブISAPIが必要です。

あなたの* .jsファイルと* .cssファイルをダイナミックファイルに変換することができます。これを* .aspxに変更して、ContentTypeを正しいMIMEタイプに設定します。たとえば:

this.Response.ContentType = "application/x-javascript"; 

唯一の他のトリックは、マークアップファイルでPageディレクティブにStyleSheetTheme=""を設定することです。それ以外の場合、ランタイムはドキュメントの<head>セクションを要求します。パフォーマンスの影響を最小限に抑えるために、出力キャッシングを有効にすることができます。

それが助け場合、私は(CSSだけで異なるMIMEタイプと、似ている)、JS側でこのことについてブログ記事を書いた:http://www.12titans.net/p/dynamic-javascript.aspx

は残念ながら、これはあなたのJSとCSSの名前を変更する必要がありますファイルを圧縮する必要がありますが、圧縮してIISにアクセスできない場合は、その方法については考えていません。

* .jsと* .css拡張を保持する場合は、web.config内にハンドラを追加することで可能です。例:

<compilation> 
    <buildProviders> 
    <add extension=".css" type="System.Web.Compilation.PageBuildProvider"/> 
    </buildProviders> 
</compilation> 

<httpHandlers> 
    <add path="*.css" verb="*" type="System.Web.UI.PageHandlerFactory" 
     validate="true"/> 
</httpHandlers> 

これは、名前付けの観点からは役立ちますが、パフォーマンスは向上しません。これらのファイルは基本的に* .aspxファイルですが、拡張子は異なります。また、ASP.NETテーマでは正しく機能しません。テーマフォルダ内のページは、拡張子にかかわらず動的ではないためです。

+1

ダイナミックに変換することに注意してください。静的ファイルを扱う際のIISは、動的(カーネルモード)よりもはるかに高速です。あなたのアプリが帯域幅の懸念によって支配されている場合にのみそれを考慮する。 – bryanmac

+0

出力キャッシュを有効にすることで、最初の要求後に静的ファイルと同じ速さで動的ファイルを作成できます。これにより、http.sysキャッシュが有効になります。 http.sysがキャッシュするクエリの文字列や動的キャッシュの無効化などの制限事項を守ってください。 – RickNZ

+0

私はjsファイルとcssファイルを圧縮できないことに失望しています。 Idはむしろファイルを動的に変換する手間を経ないでください。私は間違いなく出力キャッシュを有効にします、私はちょうど最初にロードする永遠にかかるページをしたくない。 – SharpBarb

0

@ RickNZの答えに追加:

が動的に変換については注意してください。静的ファイルを扱う際のIISは、動的(カーネルモード)よりもはるかに高速です。あなたのアプリが帯域幅の懸念によって支配されている場合にのみそれを考慮する。

もう1つのオプションは、静的コンテンツ(コンテンツ配信ネットワーク)のCDNを調べることです。 Azure、Amazon、Akamaiなどがサービスを提供しています。これは静的なファイルを提供する、地理的に非常に速いフレンドリーな方法です。

+0

CDNをよく見てください。私たちが使用しているウェブサーバはローカルなので、CDNからローカルに、または圧縮されたファイルを全部ダウンロードする方が速いのだろうか – SharpBarb

+0

ローカルであればおそらくそれほど良いとは思わない - CDNはクラウドのWebサイトを支援し、 。 – bryanmac

関連する問題