.net - 配置 IIS 7.5 以发送压缩后的 JSON 响应,NO_MATCHING_CONT

所以我试图让我的应用使用动态压缩和 gzip 发送其 JSON 响应。不幸的是,这不起作用。服务器上的所有静态压缩都工作正常,但不是动态的。

我已经通过添加:

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

<dynamicTypes> <httpCompression>部分在 applicationHost.config 文件中。我正在使用 Charles 来检查 HTTP 请求,并且可以验证我正在使用 Accept-Encoding: gzip, deflate 发送请求。 header 集。我都试过了Accept: */*Accept: application/json .当它不起作用时,我启用了“失败的请求”跟踪日志来查找 DYNAMIC_COMPRESSION_NOT_SUCCESS 的错误代码,即 NO_MATCHING_CONTENT_TYPE .

我一直在尝试在论坛和 Google 上进行研究,但我所看到的只是人们说使用带有指定字符集的 mimeType 可以解决他们的问题,但在我的情况下它仍然无法正常工作,我可以验证响应返回标题为 Content-Type: application/json; charset=utf-8

提供 JSON 响应的端点是标有 [ScriptService()] 注释的标准 .NET ASMX WebServices在类里面和[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]在方法。他们返回 JSON 很好,但我无法让动态压缩为我的生命工作。

由于这些也是常规的网络方法,我还添加了:

<add mimeType="text/xml" enabled="true" />
<add mimeType="text/xml; charset=utf-8" enabled="true" />

尝试压缩 XML 响应。令人沮丧的是,这种压缩有效,而从同一方法发送 JSON 则无效。在这一点上,我有点不知所措。

最佳答案

您要确保 */* mime 类型位于您添加的类型之后。还要确保您已经使用服务器管理器(或 OptionalFeatures.exe)安装了动态压缩模块

这是我用来确保完成良好压缩的命令行。 (但请确保您确实安装了动态和静态压缩模块):

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/serverRuntime /frequentHitThreshold:"1"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/urlCompression /doDynamicCompression:"True"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/json']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/json; charset=utf-8']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/javascript']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/x-javascript']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/x-javascript',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/x-javascript; charset=utf-8']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/x-javascript; charset=utf-8',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='*/*']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='*/*',enabled='False']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"staticTypes.[mimeType='application/javascript']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='application/javascript',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"staticTypes.[mimeType='application/x-javascript']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='application/x-javascript',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"staticTypes.[mimeType='application/x-javascript; charset=utf-8']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='application/x-javascript; charset=utf-8',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"staticTypes.[mimeType='*/*']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='*/*',enabled='False']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /noCompressionForHttp10:"False" /noCompressionForProxies:"False" /minFileSizeForComp:"2700"

运行后,您的 %windir%\system32\inetsrv\config\ApplicationHost.config 应该类似于(注意 / 在底部):

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

关于.net - 配置 IIS 7.5 以发送压缩后的 JSON 响应,NO_MATCHING_CONTENT_TYPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11617744/

相关文章:

json - 在 oracle 12c 中以 JSON 形式返回 sql 查询的结果

c# - 如何返回 JSON 对象

.net - 为什么 ServiceStack.Text 不默认日期为 iso8601?

ruby - 解析没有引用键的 JSON

java - 序列化对象时如何让 jackson 忽略 get() 方法

json - 如何在 Play Framework 2.x 中实现嵌入式对象的隐式 Json 写入

json - 如何在 spark sql 中解析嵌套的 JSON 对象?

jquery - 将数据从 jquery ajax 请求传递到 wcf 服务失败反序列化?

json - 确保数组中的项目属性在 Json Schema 中是唯一的?

java - 使用 gson 反序列化时将默认值设置为变量