web-dev-qa-db-ja.com

Windows Azure動的コンテンツでgzip HTTP圧縮を有効にする方法

GETおよびPOSTリクエストからのみJSONを返すWindows AzureホストのWCF Restfulサービスでgzip HTTP圧縮を有効にしようとして失敗しました。

すべてを一覧表示するのに苦労するほど多くのことを試しましたが、今では競合する情報(古いバージョンのAzureなどに関して)で作業していることに気付いたので、白紙の状態から始めるのが最善だと思います!

2010年2月のVisual Studio用ツールを使用して、Visual Studio 2008で作業しています。

したがって、次のように link ..

.. HTTP圧縮が有効になりました。次のページのアドバイスを使用しました(URL圧縮のアドバイスのみ)。

http://blog.smarx.com/posts/iis-compression-in-windows-Azure

<urlCompression doStaticCompression="true" 
         doDynamicCompression="true"
         dynamicCompressionBeforeCache="true" 
/>

..しかし、圧縮されません。 urlCompressionhttpCompressionの違いがわからないことは役に立ちません。私は見つけようとしましたが、役に立ちませんでした!

Visual Studioのツールが圧縮をサポートするAzureのバージョンより前にリリースされたという事実は問題になるのでしょうか。最新のツールを使用すると、発行時に使用するAzure OSのバージョンを選択できることをどこかで読んだことがありますが、それが本当かどうかはわかりません。それが本当かどうかはわかりません。選択します。 httpより前のバージョンを使用できますか?

また、blowery http圧縮モジュールを試しましたが、結果はありません。

これを達成する方法について最新のアドバイスはありますか?つまり、Azure OSの現在のバージョンに関するアドバイスです。

乾杯!

スティーブン

更新: 上記のコードを編集して、web.configスニペットのタイプを修正しました。

アップデート2: 以下の回答に示されているwhatsmyip URLを使用して応答をテストすると、service.svcからのJSON応答が圧縮されずに静的HTMLページで返されていることがわかります ある gzip圧縮で返されます。 JSON応答を圧縮する方法についてのアドバイスは、ありがたく受け取られます!

更新3: 256KBを超えるJSON応答を試して、以下のコメントに記載されているように、JSON応答がこれよりも小さいことが原因であるかどうかを確認しました。残念ながら、応答はまだ圧縮されていません。

58
Steven Elliott

まあ、それはvery長い時間がかかりました...しかし、私はこれを最終的に解決しました。苦労している他の人のために答えを投稿したいと思います。解決策は非常に簡単で、確実に機能することを確認しました。

ServiceDefinition.csdefファイルを編集して、これをWebRoleタグに含めます。

    <Startup>
      <Task commandLine="EnableCompression.cmd" executionContext="elevated" taskType="simple"></Task>
    </Startup>

Webロールでテキストファイルを作成し、「EnableCompression.cmd」として保存します。

EnableCompression.cmdはこれを含む必要があります:

%windir%\system32\inetsrv\appcmd set config /section:urlCompression /doDynamicCompression:True /commit:apphost
%windir%\system32\inetsrv\appcmd set config  -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost

.. 以上です!できた!これにより、webロールによって返されたjsonの動的圧縮が可能になります。私がどこかで読んだと思いますが、MIMEタイプはかなり変わっています。そのため、コードを正確にコピーしてください。

73
Steven Elliott

まあ、少なくとも私はこれについては一人ではありません-そしてそれはほぼ1年後のまだ愚かなPITAです。

問題はMIMEタイプの不一致です。 WCFはContent-Type: application/json; charset=UTF-8でJSON応答を返します。 デフォルトIIS構成 は、ページの半分ほど下にあり、圧縮可能なMIMEタイプとして含まれていません。

さて、あなたのweb.configに<httpCompression>セクションを追加し、それにapplication/jsonを追加したくなるかもしれません。ただし、これは1〜2時間を無駄にするための悪い方法です。applicationHost.configレベルでのみ<httpCompression>要素を変更できます。

したがって、考えられる解決策は2つあります。最初に、デフォルトの構成で圧縮可能なMIMEタイプを使用するようにWCF応答を変更できます。 text/jsonは機能するので、これをサービスメソッドに追加すると動的圧縮が行われます:WebOperationContext.Current.OutgoingResponse.ContentType = "text/json";

または、appcmdと起動タスクを使用してapplicationHost.configファイルを変更することもできます。これについては、(特に) このスレッド で説明されています。そのスタートアップタスクを追加して開発ファブリックで実行すると、1回だけ機能することに注意してください。すでに構成要素を追加しているため、2回目に失敗します。私は、別のcsdefファイルを使用して2番目のクラウドプロジェクトを作成することになりました。これにより、私のdevfabricがその起動スクリプトを実行しなくなりました。しかし、おそらく他の解決策があります。

更新

前の段落で個別のプロジェクトを提案したのは、あまり良い考えではありません。べき等でない起動タスクは非常に悪い考えです。いつかAzureファブリックがロールを再起動することを決定し、起動タスクが失敗し、リサイクルループに入るからです。おそらく深夜です。代わりに、 this SO thread で説明されているように、スタートアップタスクをべき等にします。

13
Brian Reischl

最初のデプロイ後に問題が発生するローカル開発ファブリックに対処するために、CMDファイルに適切なコマンドを追加して構成をリセットしました。さらに、いくつかの(すべての?)ケースではデフォルトでゼロに設定されているように見えるため、ここでは圧縮レベルを具体的に設定しています。

REM Remove old settings - keeps local deploys working (since you get errors otherwise)
%windir%\system32\inetsrv\appcmd reset config -section:urlCompression
%windir%\system32\inetsrv\appcmd reset config -section:system.webServer/httpCompression 

REM urlCompression - is this needed?
%windir%\system32\inetsrv\appcmd set config -section:urlCompression /doDynamicCompression:True /commit:apphost
REM Enable json mime type
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost

REM IIS Defaults
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='text/*',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='message/*',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/x-javascript',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='*/*',enabled='False']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='text/*',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='message/*',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='application/javascript',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='*/*',enabled='False']" /commit:apphost

REM Set dynamic compression level to appropriate level.  Note gzip will already be present because of reset above, but compression level will be zero after reset.
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"[name='deflate',doStaticCompression='True',doDynamicCompression='True',dynamicCompressionLevel='7',dll='%%Windir%%\system32\inetsrv\gzip.dll']" /commit:apphost
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression -[name='gzip'].dynamicCompressionLevel:7 /commit:apphost
4
scolestock

MSからのこの記事は、JSONのスクリプトを作成する方法です http://msdn.Microsoft.com/en-us/library/windowsazure/hh974418.aspx

それは言及された問題の多くを扱います。 Azureリサイクルなどに対応できる

3
GraemeMiller

エラータイプ183に関してこれに問題があり、解決策を見つけました。したがって、他の誰かがこれを経験している場合、ここに行きます:

ここに私が得たエラーがあります:

ユーザープログラム「F:\ approot\bin\EnableCompression.cmd」は、ゼロ以外の終了コード183で終了しました。作業ディレクトリはF:\ approot\binです。

そして、これが私のためにそれを修正したコードです:

REM   *** Add a compression section to the Web.config file. ***
%windir%\system32\inetsrv\appcmd set config /section:urlCompression /doDynamicCompression:True /commit:apphost >> "%TEMP%\StartupLog.txt" 2>&1

REM   ERRORLEVEL 183 occurs when trying to add a section that already exists. This error is expected if this
REM   batch file were executed twice. This can occur and must be accounted for in a Windows Azure startup
REM   task. To handle this situation, set the ERRORLEVEL to zero by using the Verify command. The Verify
REM   command will safely set the ERRORLEVEL to zero.
IF %ERRORLEVEL% EQU 183 DO VERIFY > NUL

REM   If the ERRORLEVEL is not zero at this point, some other error occurred.
IF %ERRORLEVEL% NEQ 0 (
   ECHO Error adding a compression section to the Web.config file. >> "%TEMP%\StartupLog.txt" 2>&1
   GOTO ErrorExit
)

REM   *** Add compression for json. ***
%windir%\system32\inetsrv\appcmd set config  -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost >> "%TEMP%\StartupLog.txt" 2>&1
IF %ERRORLEVEL% EQU 183 VERIFY > NUL
IF %ERRORLEVEL% NEQ 0 (
   ECHO Error adding the JSON compression type to the Web.config file. >> "%TEMP%\StartupLog.txt" 2>&1
   GOTO ErrorExit
)

REM   *** Exit batch file. ***
EXIT /b 0

REM   *** Log error and exit ***
:ErrorExit
REM   Report the date, time, and ERRORLEVEL of the error.
DATE /T >> "%TEMP%\StartupLog.txt" 2>&1
TIME /T >> "%TEMP%\StartupLog.txt" 2>&1
ECHO An error occurred during startup. ERRORLEVEL = %ERRORLEVEL% >> "%TEMP%\StartupLog.txt" 2>&1
EXIT %ERRORLEVEL%

解決策は http://msdn.Microsoft.com/en-us/library/Azure/hh974418.aspx にあります

3
Martin

はい、必要なOSを選択できますが、デフォルトでは最新のものを取得します。

圧縮は注意が必要です。うまくいかないことがたくさんあります。偶然にも、プロキシサーバーの背後でこのテストを行っていますか? IISデフォルトでは、圧縮されたコンテンツはプロキシに送信されません。これを試してみたところ、圧縮が機能しているかどうかをテストする便利なツールが見つかりました: http:// www .whatsmyip.org/http_compression /

DoDynamicCompression = "false"があるようです...それは単なるタイプミスですか? Webサービスから返すJSONで圧縮を取得する場合は、このオプションをオンにしておく必要があります。

0
smarx