2012-12-10 24 views
5

Ok, ho letto per ore su questo. Dozzine di post SO e blog, ecc. Nessuna risposta da trovare.Json HTTP-Compressione con Gzip In IIS8

Obiettivo: abilitare la compressione http dinamica della risposta json dal servizio WCF.

Nota: gzip lavora già per i contenuti statici e per il contenuto dinamico quando applicationhost.config contiene quanto segue:

<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> 

Purtroppo sul server che sto utilizzando la seguente riga che manca applicationhost.config:

<add mimeType="application/json; charset=utf-8" enabled="true" /> 

E non posso aggiungerlo manualmente perché il server è un'istanza AWS EC2 lanciato da Elastic Beanstalk (come tale ho potuto cambiarlo su un caso ma non su tutte le istanze ogni volta che vengono lanciati).

Inoltre, purtroppo, l'applicationhost.config include questa linea:

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

Il che significa che non posso ignorare la sezione httpCompression nel web.config di mia app.

La mia domanda: ci sono altri approcci per abilitare la compressione gzip di contenuti dinamici che dovrei provare?

Se overrideModeDefault = "Consenti", sarei quindi in grado di posizionare la sezione httpCompression nel web.config della mia app e aspettarmi che sovrascriva?

Felice di aggiungere ulteriori chiarimenti se necessario.

Acclamazioni

+0

Sto anche cercando una soluzione a questo stesso problema. –

+0

Duplicato ... http://stackoverflow.com/questions/4584956/compressing-a-web-service-response-for-jquery http://stackoverflow.com/questions/10795165/iis-7-5 -not-compressing-json-when-set-in-application-web-config – ncubica

+0

come si risolve il problema ?? – ncubica

risposta

0

in ritardo alla festa qui, ma questo è sicuramente possibile senza un AMI.

Creare un bucket s3 per ospitare i file di installazione. In questo esempio ho un bucket chiamato mys3bucket. Carica il seguente file nel bucket in mybucket/ebExtensions/setup.ps1

Questo file ha modificato la configurazione host dell'applicazione root.

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." 

Successivamente è necessario utilizzare elastic beanstalk extensions nel progetto.

Aggiungere il seguente file init.config alla cartella .ebextles dalla radice del sito Web. Questo è un file YAML, quindi usa le indentazioni di spazio e non le tabulazioni.

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" 

Assicurarsi che l'istanza ha il permesso al secchio attraverso un ruolo, altrimenti passare AWS credenziali nella chiamata alla lettura S3Object

È possibile che questo comporta nel modo seguente

  • Sul Evento di file beanstalk elastico un nuovo file chiamato init.ps1 verrà scritto in c: \ cfn \ init.ps1
  • Durante l'evento Commands viene eseguito il file init.ps1.
  • L'init.il file ps1 scarica il file di installazione da S3 e lo esegue. (Si noti che è possibile inserire tutto il PowerShell in linea ma questo mantiene lo YAML pulito e rende più semplice l'uso di più file durante l'installazione in corso.)