58

WindowsAzureでホストされているWCFRestfulサービスでgzipHTTP圧縮を有効にしようとして失敗しました。このサービスは、GETおよびPOSTリクエストからのみJSONを返します。

たくさんのことを試したので、すべてをリストするのに苦労しましたが、(古いバージョンの紺碧などに関して)矛盾する情報を扱っていることに気づきました。きれいな状態から始めるのが最善だと思います。

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

だから、次のリンクによると..

..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より前のバージョンを使用できますか?

ブローリーhttp圧縮モジュールも試しましたが、結果がありません。

これを達成する方法について、誰かが最新のアドバイスを持っていますか?つまり、AzureOSの現在のバージョンに関連するアドバイス。

乾杯!

スティーブン

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

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

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

4

6 に答える 6

74

かなり時間がかかりましたが…やっと解決しましたので、苦労している方のために回答を投稿したいと思います。解決策は非常に簡単で、間違いなく機能することを確認しました!!

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-roleによって返されるjsonの動的圧縮が可能になります。これは、どこかで読んだmimeタイプがかなり奇妙だと思うので、コードを正確にコピーするようにしてください。

于 2011-09-11T00:56:03.037 に答える
13

少なくとも私はこれだけではありません-そしてそれはほぼ1年後もまだ愚かなPITAです。

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

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

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

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

アップデート

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

于 2011-04-14T22:09:45.720 に答える
4

最初のデプロイ後に問題が発生したローカル開発ファブリックに対処するために、適切なコマンドを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
于 2012-02-14T22:03:30.957 に答える
3

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

Azureのリサイクルなどを処理できるなど、言及されている問題の多くを扱います。

于 2014-01-21T17:10:39.033 に答える
3

エラータイプ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にあります

于 2014-11-25T03:15:11.510 に答える
0

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

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

doDynamicCompression = "false"があるようです...これはタイプミスですか?Webサービスから返すJSONを圧縮する場合は、これをオンにします。

于 2010-05-05T20:31:27.620 に答える