2012-12-10 16 views
5

Ok, czytałem wiele godzin na ten temat. Dziesiątki wpisów SO i blogów itp. Nie można znaleźć odpowiedzi.Kompresja HTTP Jsona z Gzipem w IIS8

Cel: włączyć dynamiczną kompresję http odpowiedzi json z mojej usługi WCF.

Uwaga: gzip już działa dla zawartości statycznej i dynamicznej zawartości kiedy applicationHost.config zawiera następujące elementy:

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files"> 
      <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> 
     <dynamicTypes> 
      <add mimeType="text/*" enabled="true" /> 
      <add mimeType="message/*" enabled="true" /> 
      <add mimeType="application/x-javascript" enabled="true" /> 
      <add mimeType="application/json; charset=utf-8" enabled="true" /> 
      <add mimeType="*/*" enabled="false" /> 
     </dynamicTypes> 
     <staticTypes> 
      <add mimeType="text/*" enabled="true" /> 
      <add mimeType="message/*" enabled="true" /> 
      <add mimeType="application/x-javascript" enabled="true" /> 
      <add mimeType="application/atom+xml" enabled="true" /> 
      <add mimeType="application/xaml+xml" enabled="true" /> 
      <add mimeType="*/*" enabled="false" /> 
     </staticTypes>  
</httpCompression> 
</system.webServer> 

Niestety na serwerze używam następujący wiersz brakuje applicationhost.config:

Nie mogę dodać tego ręcznie, ponieważ serwer jest instancją ECS AWS uruchomioną przez Elastic Beanstalk (jako taką mogłem ją zmienić na jednym egzemplarzu, ale nie we wszystkich przypadkach, gdy są one uruchamiane).

także niestety applicationHost.config zawiera wiersz:

<section name="httpCompression" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> 

co oznacza, że ​​nie mogą zastąpić sekcję httpCompression w mojej aplikacji web.config.

Moje pytanie: czy są inne podejścia do włączania kompresji dynamicznej w gzip, które powinienem wypróbować?

Jeśli przesłonięModeDefault = "Zezwól", czy będę mógł umieścić sekcję httpCompression w pliku web.config mojej aplikacji i oczekiwać, że zastąpi?

Zadowoleni z dodania dalszych wyjaśnień w razie potrzeby.

Cheers

+0

Poszukuję również rozwiązania tego problemu. –

+0

Duplikat ... http://stackoverflow.com/questions/4584956/compressing-a-web-service-response-for-jquery http://stackoverflow.com/questions/10795165/iis-7-5 -nie-kompresując-json-kiedy-zestaw-w-aplikacji-web-config – ncubica

+0

jak rozwiązać swój problem? – ncubica

Odpowiedz

0

późno do partii tutaj, ale jest to z pewnością możliwe bez AMI.

Utwórz zasobnik s3 do przechowywania plików konfiguracyjnych. W tym przykładzie mam wiadro o nazwie mys3bucket. Prześlij następujący plik do zasobnika pod mybucket/ebExtensions/setup.ps1

Ten plik zmodyfikował konfigurację głównego hosta aplikacji.

write-host "Applying IIS configuration ..." 

$globalConfig = "C:\Windows\System32\inetsrv\config\applicationHost.config" 

$xmlDoc = new-object System.Xml.XmlDocument 

$xmlDoc.Load($globalConfig) 

#Set minimum compression size 
write-host "Setting minimum compression size ..." 
$xmlCurrentNode = $xmlDoc.SelectSingleNode("/configuration/system.webServer/httpCompression") 
if ($xmlCurrentNode -eq $null) 
{ 
    $xmlCurrentNode = $xmlDoc.CreateElement("httpCompression") 
    $xmlDoc.SelectSingleNode("/configuration/system.webServer").AppendChild($xmlCurrentNode) 
} 
$xmlCurrentNode.SetAttribute("minFileSizeForComp", "10240") 
$xmlCurrentNode.SetAttribute("dynamicCompressionEnableCpuUsage", "70") 
write-host "Done." 

#Enable dynamic compression 
write-host "Enabling dynamic compression ..." 
$xmlCurrentNode = $xmlDoc.SelectSingleNode("/configuration/system.webServer/urlCompression") 
if ($xmlCurrentNode -eq $null) 
{ 
    $xmlCurrentNode = $xmlDoc.CreateElement("urlCompression") 
    $xmlDoc.SelectSingleNode("/configuration/system.webServer").AppendChild($xmlCurrentNode) 
} 
$xmlCurrentNode.SetAttribute("doDynamicCompression", "true") 
write-host "Done." 

#Add dynamic types for compression 
write-host "Adding dynamic types ..." 
$xmlCurrentNode = $xmlDoc.SelectSingleNode("/configuration/system.webServer/httpCompression/dynamicTypes") 
if ($xmlCurrentNode -eq $null) 
{ 
    $xmlCurrentNode = $xmlDoc.CreateElement("dynamicTypes") 
    $xmlDoc.SelectSingleNode("/configuration/system.webServer/httpCompression").AppendChild($xmlCurrentNode) 
} 
$xmlCurrentNode = $xmlDoc.SelectSingleNode("/configuration/system.webServer/httpCompression/dynamicTypes/add[@mimeType='application/*']") 
if ($xmlCurrentNode -eq $null) 
{ 
    $xmlCurrentNode = $xmlDoc.CreateElement("add") 
    $xmlCurrentNode.SetAttribute("mimeType", "application/*") 
    $xmlDoc.SelectSingleNode("/configuration/system.webServer/httpCompression/dynamicTypes").AppendChild($xmlCurrentNode) 
} 
$xmlCurrentNode.SetAttribute("enabled", "true") 
write-host "Done." 

write-host "Saving the target config file ..." 
$xmlDoc.Save("$globalConfig") 
write-host "Done." 

Następnie trzeba użyć elastic beanstalk extensions w projekcie.

Dodaj następujący plik init.config do folderu .ebextensions z katalogu głównego swojej witryny. Jest to plik YAML, więc używaj wcięcia spacji, a nie kart.

files: 
    "c:/cfn/init.ps1": 
    content: | 
     $instanceDoc = Invoke-RestMethod 'http://169.254.169.254/latest/dynamic/instance-identity/document' 
     $extPath = "c:\cfn\.ebextensions" 
     if (Test-Path $extPath) { 
      Remove-Item $extPath -Recurse 
     } 
     Read-S3Object -BucketName "mys3bucket" -Folder $extPath -KeyPrefix '/ebExtensions' -Region ($instanceDoc.region) 
     . (Join-Path $extPath -ChildPath '\setup.ps1') 
container_commands: 
    00-invoke-init: 
    command: powershell.exe -nologo -noprofile -file "c:\cfn\init.ps1" 

Sprawdź, czy instancja ma uprawnienia do wiadra za pośrednictwem roli, inaczej przekazać AWS poświadczeń w zaproszeniu do odczytu S3Object

Powyższy wykonuje następującą

  • na Pliki elastyczne zdarzenie beanstalk nowy plik o nazwie init.ps1 zostanie zapisany w pliku c: \ cfn \ init.ps1
  • Podczas zdarzenia Commands zostanie wykonany plik init.ps1.
  • The init.Plik ps1 pobiera plik instalacyjny z S3 i wykonuje go. (Zauważ, że możesz umieścić wszystkie linie poleceń inline, ale dzięki temu YAML będzie czysty i ułatwi korzystanie z wielu plików podczas instalacji.)