Mengapa IIS 7 mengabaikan tipe MIME tertentu (tapi tidak semua) untuk kompresi? Kesalahan pemberian: DYNAMIC_COMPRESSION_NOT_SUCCESS - Alasan 12

11

Jadi, saya sedikit dari IIS7 n00b tetapi saya telah menggunakan sebagian besar sistem IIS lama kembali ke 3. Saya mencoba untuk menghidupkan kompresi dinamis dan itu berfungsi, kebanyakan. Tidak berfungsi untuk permintaan Layanan Data ADO.Net saya (Astoria), batched atau tidak.

Saya menemukan penelusuran permintaan gagal (FREB) yang sangat membantu. Dan apa yang saya lihat pada permintaan yang tidak cocok adalah Reason Code 12, NO_MATCHING_CONTENT_TYPE. OK, jadi saya tidak menentukan jenis MIME yang cocok, itu mudah.

Kecuali ini yang saya miliki di web.config saya (yang menurut saya benar, tapi mungkin tidak).

<httpCompression dynamicCompressionDisableCpuUsage="100"
                 dynamicCompressionEnableCpuUsage="100"
                 noCompressionForHttp10="false"
                 noCompressionForProxies="false"
                 noCompressionForRange="false"
                 sendCacheHeaders="true"
                 staticCompressionDisableCpuUsage="100"
                 staticCompressionEnableCpuUsage="100">
    <dynamicTypes>
        <clear/>
        <add mimeType="*/*"
             enabled="true" />
    </dynamicTypes>
    <staticTypes>
        <clear/>
        <add mimeType="*/*"
             enabled="true" />
    </staticTypes>
</httpCompression>
<urlCompression doDynamicCompression="true"
                doStaticCompression="true"
                dynamicCompressionBeforeCache="false" />

Sekarang saya berpikir bahwa ini berarti harus memampatkan setiap permintaan yang menyertakan header Terima: Gzip. Saya ingin tahu apa yang dipikirkan orang lain di sini.

Jejak pemain biola saya:

GET /SecurityDataService.svc/GetCurrentAccount HTTP/1.1
Accept-Charset: UTF-8
Accept-Language: en-us
dataserviceversion: 1.0;Silverlight
Accept: application/atom+xml,application/xml
maxdataserviceversion: 1.0;Silverlight
Referer: http://sdev03/apptestpage.aspx
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.21022; .NET CLR 3.5.30729; InfoPath.2; .NET CLR 3.0.30729; OfficeLiveConnector.1.4; OfficeLivePatch.1.3)
Host: sdev03
Connection: Keep-Alive
Cookie: .ASPXAUTH=<snip>


HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: application/atom+xml;charset=utf-8
Server: Microsoft-IIS/7.0
DataServiceVersion: 1.0;
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Mon, 22 Mar 2010 22:29:06 GMT
Content-Length: 2726

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
*** <snip> removed ***
Peter Oehlert
sumber
1
JANGAN GUNAKAN NOTEPAD untuk mengedit applicationHost.config. Saya sudah menyia-nyiakan beberapa jam sebelum mengerti bahwa perubahan saya dibuat di notepad ++ (dan juga di editor Visual Studio 2010 !!) tidak diterapkan oleh IIS. Cara alternatif untuk menambahkan mimeType tambahan ke koleksi dynamicTypes / staticTypes adalah dengan menggunakan appcmd. "C:\Windows\System32\Inetsrv\Appcmd.exe" set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']" /commit:apphostDan lagi: setelah perubahan ini dibuat - Anda akan melihatnya hanya di notepad. Notepad ++ (dan juga editor Visual Studio 2010 !!)
Sasha
Alexander, saya tidak 100% yakin saya mengerti apa yang Anda katakan di sini, tetapi saya dapat mengatakan dengan pasti bahwa memodifikasi konfigurasi IIS dengan editor teks berfungsi dengan baik. Anda mungkin mengalami kesulitan dengan editor yang menambahkan penanda BOM, tetapi selain itu harus baik-baik saja. Dalam kasus saya, bukan karena saya tidak bisa menggunakan notepad untuk mengeditnya, hanya karena saya mengedit file yang salah. Tidak semua perubahan konfigurasi dapat dilakukan di web.config yang ada di root web aplikasi. Beberapa harus dilakukan terhadap appHost di folder System.
Peter Oehlert
6
@alexander: Benar, menggunakan aplikasi 32-bit seperti notepad ++ atau visual studio pada windows 64-bit akan mendapatkan WOW64 untuk memicu pengalihan file untuk folder System32. Pengeditan akan membuat klon dalam C: \ WINDOWS \ SysWOW64 hanya dapat dilihat oleh program 32-bit dan itu tidak akan pernah digunakan oleh IIS yang merupakan program 64-bit
Fredrik Haglund
Notepad sebenarnya berfungsi ... Notepad ++ dan Visual Studio bisa dialihkan.
Brian White
@FredrikHaglund Holy merokok. Saya akan menyarankan untuk meletakkan komentar itu dalam jawabannya sendiri dengan beberapa penjelasan ... Saya tidak tahu bahwa sesuatu seperti itu akan terjadi, dan akan mengejar ekor saya selama berjam-jam lagi jika saya tidak melihat komentar Anda. (Props juga untuk Sasha dan Brian White yang juga menyebutkan masalah ini, tetapi komentar Anda tampaknya paling dekat dengan inti masalah.)
Beska

Jawaban:

7

OK, ternyata Anda tidak bisa mengonfigurasi ini di web.config, hanya appHost.config. Saya kira dokumen mengatakan appHost.config tapi saya berasumsi itu adalah spesifikasi dari konsep umum, bukan satu-satunya lokasi konfigurasi yang diijinkan.

Peter Oehlert
sumber
Benar. konfigurasi system.webServer tidak memungkinkan httpCompression di tingkat situs Web. Anda dapat mengkonfigurasi hal yang sama di root yaitu di applicationhost.config.
Vivek Kumbhar
hmm .. docs mengatakan bisa diterapkan di tingkat web.config - gulir ke bawah: msdn.microsoft.com/en-us/library/ms690689(v=vs.90).aspx dan lihat "Lokasi konfigurasi" tabel .. Apakah ada masalah dalam dokumentasi?
avs099
@ avs099 Saya tidak tahu. Ketika saya memposting ini 3 tahun yang lalu, saya yakin saya mulai dengan web.config dan saya memposting b / c itu tidak berfungsi. Mungkin fungsi berubah dalam tambalan atau dokumen salah. Akan baik untuk menguji untuk mencari tahu.
Peter Oehlert
1
oh - mungkin saya tidak jelas - cara saya membaca dokumentasi, ia mengatakan httpCompression BISA digunakan di web.config - tetapi saya tidak bisa membuatnya bekerja sehingga saya akhirnya memodifikasi file applicationHost.config juga. Bagi saya yang kelihatannya dokumentasi itu menyesatkan. Saya akan menautkan jawaban saya di SO di sini: stackoverflow.com/a/20552186/1246870
avs099
Lihat jawaban saya - secara default, instalasi IIS yang bersih mematikan web.configpenggantian pengaturan kompresi, itulah sebabnya Anda harus memodifikasi applicationHost.config. Alih-alih mengubah pengaturan kompresi di sana, Anda hanya dapat membiarkan penggantian, dan Anda kembali dalam bisnis.
mcw
3

Peter, terima kasih atas petunjuknya - kami juga menemukan pengaturan itu

<add mimeType="application/atom+xml; charset=utf-8" enabled="true" />

di <httpCompression>bagian applicationHost.configdiperbaiki ini.

Kami juga harus menentukan pengkodean karena bug dalam kode kompresi:

Ada bug dalam kode kompresi yang tidak mem-parsing charset di header respons dengan benar, sehingga Anda harus mengkonfigurasi "application / xml; charset = utf-8" dalam pengaturan kompresi dinamis agar bisa berfungsi.

Inilah bagian yang relevan secara penuh

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" dynamicCompressionLevel="4" />
    <scheme name="deflate" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" dynamicCompressionLevel="4" />
    <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="application/atom+xml; charset=utf-8" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </dynamicTypes>
    <staticTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/javascript" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </staticTypes>
</httpCompression>
Jeff Atwood
sumber
3

Dari instalasi baru, applicationHost.config(dalam %windir%\system32\inetsrv\config) saya memiliki pengaturan berikut:

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

... serta serangkaian standar tipe MIME untuk mengompres itu, sayangnya, tidak termasuk JSON dan tipe data lain yang akan menjadi kandidat kompresi yang baik.

Beralih ke:

<section name="httpCompression" overrideModeDefault="Allow" />

mengaktifkan konfigurasi httpCompressiontag di bawah system.webServertag di my web.config.

Saya mengkonfirmasi ini dengan mengatur httpCompressionbagian applicationHost.configke:

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
    <dynamicTypes>
        <add mimeType="*/*" enabled="false" />
    </dynamicTypes>
    <staticTypes>
        <add mimeType="*/*" enabled="false" />
    </staticTypes>
</httpCompression>

... dan sekarang saya dapat mengatur semua tipe MIME yang sebenarnya ingin saya kompres di web.config.

mcw
sumber
Pelacakan permintaan yang gagal sangat membantu saya dalam memecahkan masalah ini: iis.net/learn/troubleshoot/using-failed-request-tracing/…
mcw
Ini tidak berfungsi sama sekali untuk IIS8 +. Apakah Anda memiliki pengalaman mendapatkan httpCompressionelemen untuk bekerja pada web.configlevel di versi IIS yang lebih baru atau apakah itu mustahil? Documents adalah mimpi buruk - sepertinya tidak mengatakan apa kesepakatan itu resmi di mana saja.
theyetiman
@ theyetiman - maaf, saya belum pernah bekerja dengan IIS8 + sama sekali. Semoga berhasil.
mcw
0

Untuk menambahkan mimetipe yang hilang dari PowerShell, gunakan perintah berikut:

Add-WebConfiguration -Filter '/system.webServer/httpCompression/staticTypes' -PSPath 'IIS:\' -AtIndex 0 -Value @{mimeType='application/javascript'; enabled='True'}

Add-WebConfiguration -Filter '/system.webServer/httpCompression/staticTypes' -PSPath 'IIS:\' -AtIndex 0 -Value @{mimeType='image/svg+xml'; enabled='True'}

Add-WebConfiguration -Filter '/system.webServer/httpCompression/staticTypes' -PSPath 'IIS:\' -AtIndex 0 -Value @{mimeType='text/css'; enabled='True'}

Perhatikan bahwa urutan mimeTypes penting, karena IIS tampaknya mengambil kecocokan pertama. Ini berarti bahwa mimeTypes dengan wildcard (*) harus di bawah mimeTypes tanpa wildcard. Oleh karena itu pastikan mimeType */*ada di bagian bawah, karena setiap entri di bawahnya tidak akan digunakan

Edit:

IIS menyebalkan, jadi opsi terbaik adalah dengan hanya menghapus staticTypes dan menambahkan semuanya kembali dalam urutan yang benar:

Clear-WebConfiguration -Filter "//system.webServer/httpCompression/staticTypes/add" -PSPath 'IIS:\'

SetCompressionOfMimeType 'text/*' 'True'
SetCompressionOfMimeType 'application/javascript' 'True'
SetCompressionOfMimeType 'image/svg+xml' 'True'
SetCompressionOfMimeType 'text/css' 'True'
SetCompressionOfMimeType '*/*' 'False'


function SetCompressionOfMimeType($mimeType, $enabled){
    Write-Output "Setting compression for $mimeType to $enabled"
    Add-WebConfiguration -Filter '/system.webServer/httpCompression/staticTypes' -PSPath 'IIS:\' -Value @{mimeType=$mimeType; enabled=$enabled}
}
Marius
sumber