Windows Azure 동적 콘텐츠에서 gzip HTTP 압축을 활성화하는 방법
Windows Azure 호스트 WCF Restful 서비스에서 GET 및 POST 요청에서만 JSON을 반환하는 gzip HTTP 압축을 활성화하려고 했지만 실패했습니다.
많은 것을 시도하고 있기 때문에, 모두 기재하는 것은 곤란합니다만, 지금까지 (오래된 버전의 Azure 등에 대해) 상충하는 정보를 가지고 작업하고 있는 것을 깨달았습니다.그 때문에, 처음부터 다시 시작하는 것이 가장 좋다고 생각합니다.
저는 Visual Studio 2008을 사용하여 2010년 2월 Visual Studio용 툴을 사용하고 있습니다.
다음 링크에 따르면
..HTTP 압축이 활성화 되었습니다.아래 페이지의 어드바이스(URL 압축 어드바이스만)를 사용하고 있습니다.
http://blog.smarx.com/posts/iis-compression-in-windows-azure
<urlCompression doStaticCompression="true"
doDynamicCompression="true"
dynamicCompressionBeforeCache="true"
/>
압축이 안 돼요urlCompression과 httpCompression의 차이를 모르는 것은 도움이 되지 않습니다.알아보려고 노력했지만 소용없었어요!
Visual Studio용 툴이 압축을 지원하는 Azure 버전보다 먼저 출시된 것이 문제가 될까요?최신 툴로 Azure OS의 버전을 선택할 수 있다는 것을 읽은 적이 있습니다만, 그것이 사실인지 아닌지, 만약 그렇다면 어느 쪽을 선택해야 할지 모르겠습니다.사전 http 지원 버전을 사용할 수 있습니까?
blowy http 압축 모듈도 시도해 봤지만 아무 결과도 없었습니다.
Azure OS의 최신 버전에 관한 조언 등 이를 실현하기 위한 최신 조언이 있습니까?
건배!
스티븐
업데이트: 위 코드를 편집하여 web.config 스니펫의 유형을 수정했습니다.
업데이트 2: 아래 답변에 표시된 Whatsmyip URL을 사용하여 응답을 테스트하면 서비스로부터의 JSON 응답이 나타납니다.svc는 압축 없이 반환되지만 정적 HTML 페이지는 gzip 압축으로 반환됩니다.JSON 응답을 압축하는 방법에 대한 조언은 감사히 받겠습니다!
업데이트 3: 256KB보다 큰 JSON 응답을 시험하여 다음 코멘트에서 설명한 것보다 작은 JSON 응답에 문제가 있는지 확인.유감스럽게도 응답은 아직 압축되지 않았습니다.
아주 오랜 시간이 걸렸지만... 드디어 이 문제를 해결했고, 어려움을 겪고 있는 사람들을 위해 답을 올리고 싶습니다.솔루션은 매우 심플하고, 확실히 동작하고 있는 것을 확인했습니다!!
ServiceDefinition.csdef 파일을 편집하여 WebRole 태그에 저장합니다.
<Startup>
<Task commandLine="EnableCompression.cmd" executionContext="elevated" taskType="simple"></Task>
</Startup>
웹 역할에서 텍스트 파일을 생성하여 "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
..바로 그거야!완료! 이렇게 하면 웹 역할이 반환하는 json에 대한 동적 압축이 활성화됩니다. 어딘가에서 읽은 바로는 이상한 MIME 유형이 있으므로 코드를 복사하십시오.
적어도 나는 이것에 혼자가 아니다 - 그리고 그것은 거의 1년이 지난 지금도 여전히 멍청한 PITA이다.
MIME은 WCF JSON 응답을 반환한다.을 WCF JSON으로 합니다.Content-Type: application/json; charset=UTF-8
페이지의 절반 정도 아래에 있는 기본 IIS 구성에는 압축 가능한 MIME 유형이 포함되지 않습니다.
경우 now경, 능 now능 를 붙이는 수 .<httpCompression>
「 web . config 」는 「Web.config」로, 「Web . config 。한두이다. 즉, 여러분은 한 시간이나 두 시간 수 있다.<httpCompression>
level.applicationHost.config .
두 가지 해결책이 있습니다.우선 기본 설정에서 압축 가능한 MIME 유형을 사용하도록 WCF 응답을 변경할 수 있습니다. text/json
서비스 메서드에 압축이 .「 」 、 「 」 、 「 」 、 「 」 、 「 」 、 「 」WebOperationContext.Current.OutgoingResponse.ContentType = "text/json";
또는 appcmd 및 시작 작업을 사용하여 applicationHost.config 파일을 변경할 수 있습니다.이것은 이 스레드에 대해 (특히) 논의되고 있습니다.이 스타트업 태스크를 추가하여 개발 패브릭으로 실행하면 1회 동작합니다.Configuration 요소를 이미 추가했기 때문에 두 번째 실패가 발생합니다.결국 별도의 csdef 파일을 사용하여 두 번째 클라우드 프로젝트를 생성하게 되었습니다.그래서 devfabric은 이 시작 스크립트를 실행하지 않았습니다.아마 다른 해결책이 있을 거예요.
갱신하다
이전 단락에서 개별 프로젝트에 대한 제 제안은 별로 좋은 생각이 아닙니다.유휴 상태가 아닌 시작 태스크는 매우 좋지 않습니다. 왜냐하면 언젠가는 Azure 패브릭이 사용자의 역할을 재시작하도록 결정하여 시작 태스크가 실패하고 재활용 루프가 되기 때문입니다.아마 한밤중일 거예요대신 이 SO 스레드에서 설명한 대로 시작 태스크를 유용하게 만드십시오.
처음 배포한 후 문제가 발생한 로컬 개발 패브릭에 대처하기 위해 CMD 파일에 적절한 명령을 추가하여 설정을 리셋했습니다.또한 압축 수준은 일부(모두?)의 경우 기본적으로 0으로 나타나기 때문에 여기서 특별히 설정합니다.
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
MS의 이 문서는 JSON http://msdn.microsoft.com/en-us/library/windowsazure/hh974418.aspx의 스크립트 작성 방법에 대한 것입니다.
Azure 재활용을 취급할 수 있는 등, 많은 문제를 다루고 있습니다.
에러 타입 183에 관한 문제가 있어서 해결책을 찾았습니다.다른 사용자가 이 문제를 겪고 있다면 다음과 같이 하십시오.
다음은 오류입니다.
사용자 프로그램 "F:\approot\bin\EnableCompression.cmd"가 0이 아닌 종료 코드 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에서 찾을 수 있습니다.
네, 원하는 OS를 선택할 수 있지만 기본적으로는 최신 OS를 사용할 수 있습니다.
압축은 까다롭다.잘못될 수 있는 많은 것들이 있다.혹시 프록시 서버 뒤에서 이 테스트를 하고 계신가요?IIS는 기본적으로 압축된 콘텐츠를 프록시로 보내지 않습니다.이것을 가지고 놀고 있을 때 압축이 작동하는지 테스트하기 위한 편리한 도구를 찾았습니다. http://www.whatsmyip.org/http_compression/.
doDynamicCompression="false"가 있는 것 같은데... 오타인가요?JSON에서 압축을 받으려면 웹 서비스에서 반환해야 합니다.
언급URL : https://stackoverflow.com/questions/2775261/how-to-enable-gzip-http-compression-on-windows-azure-dynamic-content
'programing' 카테고리의 다른 글
Json.NET: 중첩된 사전을 역직렬화하는 중 (0) | 2023.04.05 |
---|---|
JSONP에서 .ajax()를 사용하는 기본적인 예? (0) | 2023.04.05 |
다음 js - 일부 페이지에서 서버 측 렌더링을 비활성화합니다. (0) | 2023.03.31 |
게시 제목에서 WordPress 게시 ID 가져오기 (0) | 2023.03.31 |
React.js의 텍스트 입력에서 변경/초점 아웃 이벤트를 올바르게 포착하는 방법 (0) | 2023.03.31 |