เหตุใด IIS 7 จึงเพิกเฉยชนิด MIME (แต่ไม่ใช่ทั้งหมด) สำหรับการบีบอัด ข้อผิดพลาดในการให้: DYNAMIC_COMPRESSION_NOT_SUCCESS - เหตุผลที่ 12


11

ดังนั้นฉันเป็น IIS7 เล็กน้อย แต่ฉันใช้ระบบ IIS ส่วนใหญ่กลับไปเป็น 3 ฉันพยายามเปิดใช้งานการบีบอัดแบบไดนามิกและใช้งานได้เป็นส่วนใหญ่ มันใช้งานไม่ได้กับคำขอ ADO.Net Data Service (Astoria) ของฉันแบบแบตช์หรือไม่

ฉันพบการติดตามคำขอที่ล้มเหลว (FREB)ซึ่งเป็นประโยชน์จริงๆ และสิ่งที่ฉันเห็นในคำขอที่ยังReason Code 12, NO_MATCHING_CONTENT_TYPEไม่ได้แบตช์คือ ตกลงดังนั้นฉันไม่ได้ระบุประเภท MIME ที่ตรงกันนั่นเป็นเรื่องง่าย

ยกเว้นนี่คือสิ่งที่ฉันมีในเว็บของฉัน config (ซึ่งฉันคิดว่าถูกต้อง แต่อาจจะไม่)

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

ตอนนี้ฉันคิดว่านี่หมายความว่าควรบีบอัดคำขอใด ๆ ที่มีส่วนหัว Accept: Gzip ฉันชอบที่จะรู้ว่าคนอื่นอาจคิดว่าที่นี่

พู้ทำเล่นของฉันติดตาม:

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

1
ใช้ NOTEPAD เพื่อแก้ไข applicationHost.config ฉันเสียเวลาไปหลายชั่วโมงก่อนที่จะเข้าใจว่าการเปลี่ยนแปลงที่ทำในแผ่นจดบันทึก ++ (รวมถึงในโปรแกรมแก้ไข Visual Studio 2010 !!) ไม่ได้ถูกนำไปใช้โดย IIS วิธีอื่นในการเพิ่ม mimeType เพิ่มเติมลงในคอลเลกชัน dynamicTypes / staticTypes คือการใช้ appcmd "C:\Windows\System32\Inetsrv\Appcmd.exe" set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']" /commit:apphostและอีกครั้ง: หลังจากการเปลี่ยนแปลงเหล่านี้เกิดขึ้นคุณจะเห็นเฉพาะใน Notepad Notepad ++ (รวมถึงโปรแกรมแก้ไข Visual Studio 2010 !!)
Sasha

อเล็กซานเดอร์ฉันไม่แน่ใจ 100% ฉันเข้าใจว่าคุณกำลังพูดอะไรอยู่ที่นี่ แต่ฉันสามารถพูดได้อย่างแน่นอนว่าการแก้ไขการกำหนดค่า IIS ด้วยโปรแกรมแก้ไขข้อความใด ๆ ก็ใช้ได้ดี คุณอาจมีปัญหากับเครื่องมือแก้ไขที่เพิ่มเครื่องหมาย BOM แต่นอกเหนือไปจากนั้นควรแก้ไข ในกรณีของฉันมันไม่ใช่ว่าฉันไม่สามารถใช้ notepad เพื่อแก้ไขได้ แต่ฉันกำลังแก้ไขไฟล์ผิด การเปลี่ยนแปลงการกำหนดค่าบางอย่างสามารถทำได้ใน web.config ซึ่งอยู่ในรูทแอปพลิเคชันของเว็บ บางตัวต้องทำกับ appHost ในโฟลเดอร์ System
Peter Oehlert

6
@alexander: จริงโดยใช้แอปพลิเคชัน 32 บิตเช่น notepad ++ หรือ visual studio บน Windows 64 บิตจะได้รับ WOW64 เพื่อเรียกใช้การเปลี่ยนเส้นทางไฟล์สำหรับโฟลเดอร์ System32 การแก้ไขจะสร้างโคลนใน C: \ WINDOWS \ SysWOW64 มองเห็นได้เฉพาะกับโปรแกรม 32 บิตและจะไม่ถูกใช้โดย IIS ซึ่งเป็นโปรแกรม 64 บิต
Fredrik Haglund

Notepad ใช้งานได้จริง ... Notepad ++ และ Visual Studio จะเปลี่ยนเส้นทาง
ไบรอันไวท์

@ FredrikHaglund ศักดิ์สิทธิ์สูบบุหรี่ ฉันขอแนะนำให้ใส่ความคิดเห็นนั้นในคำตอบของตัวเองพร้อมคำอธิบายบางอย่าง ... ฉันไม่รู้ว่าจะเกิดอะไรขึ้นและจะไล่ล่าหางของฉันไปอีกหลายชั่วโมงถ้าฉันไม่เห็นความคิดเห็นของคุณ (อุปกรณ์ประกอบฉากกับ Sasha และ Brian White ที่พูดถึงปัญหาด้วยเช่นกัน แต่ความคิดเห็นของคุณน่าจะใกล้เคียงกับหัวใจของปัญหามากที่สุด)
Beska

คำตอบ:


7

ตกลงปรากฎว่าคุณไม่สามารถกำหนดค่านี้ใน web.config เฉพาะ appHost.config ฉันคิดว่าเอกสารนั้นบอกว่า appHost.config แต่ฉันคิดว่ามันเป็นสเปคของแนวคิดทั่วไปไม่ใช่ตำแหน่งการกำหนดค่าที่อนุญาตเท่านั้น


แก้ไข. การกำหนดค่า system.webServer ไม่อนุญาต httpCompression ในระดับเว็บไซต์ คุณสามารถกำหนดค่าเดียวกันที่รูทเช่นใน applicationhost.config
Vivek Kumbhar

อืม .. เอกสารบอกว่าสามารถใช้งานได้ที่ระดับ web.config - เลื่อนไปที่ด้านล่าง: msdn.microsoft.com/en-us/library/ms690689(v=vs.90).aspxและดูที่ "ตำแหน่งการกำหนดค่า" ตาราง .. มันเป็นปัญหาในเอกสารประกอบหรือไม่?
avs099

@ avs099 ฉันไม่รู้ เมื่อฉันโพสต์เมื่อ 3 ปีที่แล้วฉันแน่ใจว่าฉันเริ่มต้นด้วย web.config และฉันโพสต์ b / c มันไม่ทำงาน อาจฟังก์ชั่นการเปลี่ยนแปลงในแพทช์หรือเอกสารที่ผิด จะเป็นการดีที่จะทดสอบเพื่อหา
Peter Oehlert

1
โอ้ - อาจเป็นเพราะฉันไม่ชัดเจน - วิธีที่ฉันอ่านเอกสารมันบอกว่า httpCompression สามารถใช้ใน web.config - แต่ฉันไม่สามารถทำงานได้ดังนั้นฉันจึงลงเอยด้วยการแก้ไขไฟล์ applicationHost.config เช่นกัน สำหรับฉันที่ดูเหมือนว่าเอกสารจะทำให้เข้าใจผิด ฉันจะเชื่อมโยงคำตอบของฉันที่ SO ที่นี่: stackoverflow.com/a/20552186/1246870
avs099

ดูคำตอบของฉัน - โดยค่าเริ่มต้น IIS ติดตั้งจะปิดการแทนที่การตั้งค่าการบีบอัดซึ่งเป็นเหตุผลที่คุณจะต้องปรับเปลี่ยนweb.config applicationHost.configแทนที่จะเปลี่ยนการตั้งค่าการบีบอัดที่นั่นคุณสามารถอนุญาตให้แทนที่ได้และกลับมาทำธุรกิจอีกครั้ง
mcw

3

ปีเตอร์ขอบคุณสำหรับคำใบ้ - เรายังพบการตั้งค่านั้น

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

ใน<httpCompression>ส่วนของการapplicationHost.configแก้ไขนี้

เราต้องระบุการเข้ารหัสเนื่องจากข้อผิดพลาดในรหัสการบีบอัด:

มีข้อผิดพลาดในรหัสการบีบอัดที่ไม่วิเคราะห์ชุดอักขระในส่วนหัวการตอบสนองอย่างถูกต้องดังนั้นคุณจะต้องกำหนดค่า "application / xml; charset = utf-8" ในการตั้งค่าการบีบอัดแบบไดนามิกเพื่อให้ทำงานได้

นี่คือส่วนที่เกี่ยวข้องเต็ม

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

3

จากการติดตั้งใหม่ฉันapplicationHost.config(ใน%windir%\system32\inetsrv\config) มีการตั้งค่าต่อไปนี้:

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

... รวมถึงชุดเริ่มต้นของประเภท MIME ที่จะบีบอัดนั้นน่าเสียดายที่ไม่มี JSON และประเภทข้อมูลอื่น ๆ ที่น่าจะเป็นตัวเลือกการบีบอัดที่ดี

เปลี่ยนเป็น:

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

ช่วยให้การกำหนดค่าของhttpCompressionแท็กภายใต้แท็กของฉัน system.webServerweb.config

ฉันยืนยันสิ่งนี้โดยการตั้งค่าhttpCompressionส่วนของเป็นapplicationHost.config:

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

... และตอนนี้ฉันสามารถตั้งค่าทุกชนิด MIME web.configที่จริงผมอยากจะบีบอัดใน


การติดตามคำขอที่ล้มเหลวมีประโยชน์มากสำหรับฉันในการแก้ไขปัญหานี้: iis.net/learn/troubleshoot/using-failed-request-tracing/…
mcw

ไม่สามารถใช้งานได้กับ IIS8 + คุณมีประสบการณ์ใดบ้างที่จะทำให้httpCompressionองค์ประกอบทำงานได้web.configระดับ IIS รุ่นใหม่กว่าหรือเป็นไปไม่ได้? เอกสารเป็นฝันร้าย - ดูเหมือนว่าจะไม่พูดว่าข้อตกลงเป็นทางการทุกที่
themetiman

@theyetiman - ขอโทษฉันไม่ได้ทำงานกับ IIS8 + เลย โชคดี.
mcw

0

ในการเพิ่ม mimetypes ที่ขาดหายไปจาก powershell ให้ใช้คำสั่งต่อไปนี้:

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

โปรดสังเกตว่าลำดับของ mimeTypes นั้นสำคัญเนื่องจาก IIS ดูเหมือนจะเป็นคู่แรก ซึ่งหมายความว่า mimeTypes ที่มี wildcards (*) ควรต่ำกว่า mimeTypes ที่ไม่มี wildcard ดังนั้นตรวจสอบให้แน่ใจว่า mimeType */*อยู่ด้านล่างเนื่องจากจะไม่มีการใช้รายการใด ๆ ด้านล่าง

แก้ไข:

IIS sucks ดังนั้นตัวเลือกที่ดีที่สุดคือการล้าง staticTypes และเพิ่มทุกอย่างกลับมาอีกครั้งตามลำดับที่ถูกต้อง:

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}
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.