Tại sao IIS 7 lại bỏ qua các loại MIME nhất định (nhưng không phải tất cả) để nén? Lỗi đưa ra: DYNAMIC_COMPRESSION_NOT_SUCCESS - Lý do 12


11

Vì vậy, tôi là một chút của IIS7 n00b nhưng tôi đã sử dụng hầu hết các hệ thống IIS cũ trở lại 3. Tôi đang cố gắng bật nén động và chủ yếu là nó hoạt động. Nó không hoạt động đối với các yêu cầu Dịch vụ dữ liệu ADO.Net (Astoria) của tôi, theo đợt hoặc không.

Tôi tìm thấy dấu vết yêu cầu thất bại (FREB) thực sự hữu ích. Và những gì tôi thấy trên các yêu cầu chưa được đáp ứng là Reason Code 12, NO_MATCHING_CONTENT_TYPE. OK, vì vậy tôi không có loại MIME phù hợp được chỉ định, điều đó thật dễ dàng.

Ngoại trừ đây là những gì tôi có trong web.config (mà tôi nghĩ là chính xác, nhưng có thể không).

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

Bây giờ tôi nghĩ rằng điều này có nghĩa là nó sẽ nén bất kỳ yêu cầu nào bao gồm tiêu đề Accept: Gzip. Tôi muốn biết những gì người khác có thể nghĩ ở đây.

Theo dõi fiddler của tôi:

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
KHÔNG SỬ DỤNG NOTEPAD để chỉnh sửa applicationhost.config. Tôi đã lãng phí vài giờ trước khi hiểu rằng những thay đổi của tôi được thực hiện trong notepad ++ (cũng như trong trình chỉnh sửa Visual Studio 2010 !!) không được IIS áp dụng. Cách khác để thêm mimeType bổ sung vào bộ sưu tập DynamicTypes / staticTypes là sử dụng appcmd. "C:\Windows\System32\Inetsrv\Appcmd.exe" set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']" /commit:apphostVà một lần nữa: sau khi những thay đổi này được thực hiện - bạn sẽ chỉ thấy chúng trong notepad. Notepad ++ (cũng như trình chỉnh sửa Visual Studio 2010 !!)
Sasha

Alexander, tôi không chắc chắn 100% Tôi hiểu những gì bạn đang nói ở đây nhưng tôi có thể nói chắc chắn rằng việc sửa đổi cấu hình IIS với bất kỳ trình soạn thảo văn bản nào đều hoạt động tốt. Bạn có thể gặp khó khăn với trình chỉnh sửa có thêm điểm đánh dấu BOM, nhưng khác với điều đó sẽ ổn. Trong trường hợp của tôi, không phải là tôi không thể sử dụng notepad để chỉnh sửa nó, chỉ là tôi đang chỉnh sửa tập tin sai. Không phải tất cả các thay đổi cấu hình có thể được thực hiện trong web.config nằm trong thư mục gốc của ứng dụng. Một số phải được thực hiện đối với apphost trong thư mục Hệ thống.
Peter Oehlert

6
@alexander: Đúng, sử dụng các ứng dụng 32 bit như notepad ++ hoặc studio trực quan trên cửa sổ 64 bit sẽ nhận được WOW64 để kích hoạt chuyển hướng tệp cho thư mục System32. Chỉnh sửa sẽ tạo một bản sao trong C: \ WINDOWS \ SysWOW64 chỉ hiển thị với các chương trình 32 bit và nó sẽ không bao giờ được sử dụng bởi IIS là chương trình 64 bit
Fredrik Haglund

Notepad thực sự hoạt động ... Notepad ++ và Visual Studio được chuyển hướng.
Brian White

@FredrikHaglund Thánh hút thuốc. Tôi sẽ đề nghị đưa nhận xét đó vào câu trả lời của riêng mình với một số lời giải thích ... Tôi không biết rằng điều gì đó sẽ xảy ra, và sẽ đuổi theo tôi trong nhiều giờ nữa nếu tôi không thấy bình luận của bạn. (Đạo cụ cũng cho Sasha và Brian White, những người cũng đề cập đến vấn đề này, nhưng bình luận của bạn dường như trở nên gần gũi nhất với trọng tâm của vấn đề.)
Beska

Câu trả lời:


7

OK, hóa ra bạn không thể cấu hình cái này trong web.config, chỉ apphost.config. Tôi cho rằng các tài liệu đã nói apphost.config nhưng tôi đã cho rằng đó là một đặc điểm kỹ thuật của một khái niệm chung, không phải là vị trí cấu hình được phép duy nhất.


Chính xác. Cấu hình system.webServer không cho phép httpCompression ở cấp độ trang Web. Bạn có thể cấu hình tương tự ở gốc tức là trong ứng dụngatioationhost.config.
Vivek Kumbhar

hmm .. docs nói rằng nó có thể được áp dụng ở cấp web.config - cuộn xuống phía dưới: msdn.microsoft.com/en-us/l Library / ms690689 ( v = vs.90) .aspx và xem "Vị trí cấu hình" bảng .. Có phải là một vấn đề trong tài liệu?
avs099

@ avs099 Tôi không biết. Khi tôi đăng bài này 3 năm trước, tôi chắc chắn rằng tôi đã bắt đầu với web.config và tôi đã đăng b / c nó không hoạt động. Có thể chức năng thay đổi trong một bản vá hoặc tài liệu bị sai. Sẽ là tốt để kiểm tra để tìm hiểu.
Peter Oehlert

1
ồ - có thể tôi không rõ ràng - cách tôi đọc tài liệu, nó nói httpCompression CÓ THỂ được sử dụng trong web.config - nhưng tôi không thể làm cho nó hoạt động được nên cuối cùng tôi cũng sửa đổi tệp apphost.config. Đối với tôi có vẻ như tài liệu là sai lệch. Tôi sẽ liên kết câu trả lời của mình tại SO tại đây: stackoverflow.com/a/20552186/1246870
avs099

Xem câu trả lời của tôi - theo mặc định, cài đặt IIS sạch sẽ tắt web.configghi đè cài đặt nén, đó là lý do tại sao bạn phải sửa đổi applicationHost.config. Thay vì thay đổi cài đặt nén ở đó, bạn chỉ có thể cho phép ghi đè thay vào đó và bạn sẽ quay lại công việc.
mcw

3

Peter, cảm ơn vì gợi ý - chúng tôi cũng tìm thấy thiết lập đó

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

trong <httpCompression>phần applicationHost.configcố định này.

Chúng tôi cũng đã phải chỉ định mã hóa do lỗi trong mã nén:

Có một lỗi trong mã nén mà nó không phân tích chính xác bộ ký tự trong tiêu đề phản hồi, do đó bạn sẽ phải định cấu hình "application / xml; charset = utf-8" trong cài đặt nén động để nó hoạt động.

Đây là phần có liên quan đầy đủ

<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

Từ bản cài đặt mới, applicationHost.config(trong %windir%\system32\inetsrv\config) của tôi đã có cài đặt sau:

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

... cũng như một tập hợp các loại MIME mặc định để nén, thật không may, không bao gồm JSON và các loại dữ liệu khác sẽ là ứng cử viên nén tốt.

Chuyển nó sang:

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

cho phép cấu hình của httpCompressionthẻ theo system.webServerthẻ trong của tôi web.config.

Tôi đã xác nhận điều này bằng cách đặt httpCompressionphần của 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>

... và bây giờ tôi có thể đặt tất cả các loại MIME mà tôi thực sự muốn nén trong web.config.


Việc theo dõi yêu cầu không thành công rất hữu ích cho tôi trong việc khắc phục sự cố này: iis.net/learn/troubledhoot/USE-fails-request-tracing/iêu
mcw

Điều này hoàn toàn không hoạt động đối với IIS8 +. Bạn có bất kỳ kinh nghiệm nào để httpCompressionphần tử hoạt động ở web.configcấp độ trong các phiên bản IIS mới hơn không? Tài liệu là một cơn ác mộng - dường như không nói thỏa thuận là bất cứ nơi nào chính thức.
theyetiman

@theyetiman - xin lỗi, tôi chưa làm việc với IIS8 +. Chúc may mắn.
mc

0

Để thêm các mô phỏng bị thiếu từ powershell, hãy sử dụng các lệnh sau:

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

Lưu ý rằng thứ tự của mimeTypes rất quan trọng, vì IIS dường như thực hiện trận đấu đầu tiên. Điều này có nghĩa là mimeTypes có ký tự đại diện (*) phải ở dưới mimeTypes không có ký tự đại diện. Do đó, hãy đảm bảo rằng mimeType */*ở dưới cùng, vì bất kỳ mục nào bên dưới nó sẽ không được sử dụng

Biên tập:

IIS hút, vì vậy, tùy chọn tốt nhất là chỉ cần xóa staticTypes và thêm lại mọi thứ theo đúng thứ tự:

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}
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.