IISがGZipの圧縮の問題と解決策

  
ページファイルは比較的大きいです、オープンGZipの圧縮はトラフィックの伝送を減らすことができます効果をテストすることは非常に明白である、読むGZip圧縮機能は、この機能もプロジェクトに適用されていますが、使用中にやや難しい問題に遭遇しました。
プロジェクトでは、Excel2007レポートファイルがサーバー側で生成され、ファイルがローカルにダウンロードされた後、正常に開くことができませんファイル形式が誤っていますExcel2007ファイル形式の本質は圧縮パッケージなので、ファイルがダウンロードされていると考えられます。変更されましたが、問題がどこにあるのかわかりません。 1. Excel2007ファイルはページのレンダリング時に出力され、End要求は出力後に出力されるため、IISの圧縮メカニズムを推測できます。これは、要求の最後ではなく、要求の最初に追加する必要があります。圧縮しました。 2.ファイルがダウンロードされると、ダウンロードボックスがダウンロード用にポップアップされ、ブラウザによって解凍されないことがあります。これはまだ検証されていません。または、圧縮パッケージが2回パッケージ化されているために圧縮パッケージを圧縮できない理由が他にもあります(Excel2007ファイルは1回パッケージ化され、IIS経由でダウンロードしたときに再度パッケージ化されました)。 IIS圧縮を使用する際の問題(現在確認されています):1.設定が不便システム内の設定ファイルを変更するには、十分な権限がない場合は設定する方法がありません。 2. IIS 6はIIS内のすべてのサイトに影響を与えますが、IIS 7にはこの問題はないと言われています。 3. IIS圧縮マシンを設定した後、設定を数回再起動すると失われます(奇妙なこと)。 Excel2007のダウンロードの問題、それはOOXML形式に問題があると推定されています。解決策:HttpModuleを使用して圧縮し、HttpModuleのPostReleaseRequestStateイベントを使用して圧縮し、Renderに圧縮時間を延期します。通常のコードではRenderをアンインストールできません:) PostReleaseRequestStateイベントはRenderの後私の実際のテストでは、ページロジックのResponse.Filterを変更することはできないことに気付いたため、エラーが報告されることがありますこれにはasp.netの権限の一部が含まれる可能性があります。それで、それでもHttpModuleでそれを正直に実装してください。 Systemを使用して、System.Collections.Genericを使用して、System.Textを使用して、System.Webを使用して、System.IOを使用して、System.IO.Compressionを使用して、
名前空間CapabilityTestパブリッククラスCompressModule:IHttpModule #region IHttpModuleメンバpublic void Dispose()
//throw new NotImplementedException(); public void Init(HttpApplication context)
context.PostReleaseRequestState + = new EventHandler(context_PostReleaseRequestState);
}
#終了領域プライベート定数文字列GZIP = "gzip";プライベート定数文字列DEFLATE = "deflate";プライベート無効context_PostReleaseRequestState(オブジェクト送信者、EventArgs e)
{
HttpApplication app = HttpApplicationとしての送信者;
ストリームフィルタ= app.Response.Filter;
if(IsEncodingAccepted(app.Request、GZIP))
app.Response.Filter = new GZipStream(filter、CompressionMode.Compress); app.Response.AppendHeader( "Content-Encoding"、GZIP); else if(IsEncodingAccepted() app.Request、DEFLATE)) {
文字列acceptEncoding = request.Headers ["Accept-Encoding"];
if(acceptEncoding) == null)falseを返し、acceptEncoding = acceptEncoding.ToLower(); if(encoding == GZIP)を返します。acceptEncodingを返します。 |  acceptEncoding.Contains( "x-gzip")| |  acceptEncoding.Contains( "*"); if(encoding == DEFLATE)return returnEncoding.Contains(DEFLATE); falseを返す;
}改良:1.カスタムConfigurationSectionを設定ファイルに追加するか、設定メソッドを使用して指定されたファイル拡張子を圧縮するか、指定されたファイル拡張子の圧縮を除外することができます。 2.ネットワーク上で、私はMicrosoftのAJAXに対処したいのですが、圧縮できないと言っている人がいるのを見かけました:return(app.Request ["HTTP_X_MICROSOFTAJAX"]!= null |} |  app.Request ["Anthem_CallBack"]!= null); 3.基本クラスまたはインタフェースを実装するページを圧縮するか圧縮しない:ICompressable p = app.Context.Handler as ICompressable; return(p == null)さらに、:IIS 6のこの記事では、最新のIIS 7は個人的には経験していませんが、圧縮の側面についてはよくわかりません。この記事に記載されているPostReleaseRequestStateイベントはasp.net 2.xでのみサポートされているため、vs2003によって開発されたプロジェクトには使用できません。
Copyright © Windowsの知識 All Rights Reserved