我一直在为我的MVC操作使用压缩过滤器,如下所示:
http://msdn.microsoft.com/en-us/magazine/gg232768.aspx
我试图改变代码的用途,为Web API做一些类似的事情,但我遇到了一个障碍:
public class CompressAPIAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext filterContext)
{
var preferredEncoding = GetPreferredEncoding(filterContext.Request);
Stream compressedStream = null;
// Compress the response accordingly
var response = filterContext.Response;
response.Headers.Add("Content-encoding", preferredEncoding.ToString());
if (preferredEncoding == CompressionScheme.Gzip)
{
response.Content = new GZipStream(compressedStream, CompressionMode.Compress); //THIS WON'T WORK
}
if (preferredEncoding == CompressionScheme.Deflate)
{
response.Content = new DeflateStream(compressedStream, CompressionMode.Compress); //THIS WON'T WORK
}
return;
}
enum CompressionScheme
{
Gzip = 0,
Deflate = 1,
Identity = 2
}
private CompressionScheme GetPreferredEncoding(HttpRequestMessage request)
{
var acceptableEncoding = request.Headers.AcceptEncoding;
if (acceptableEncoding.Where(h => h.Value.Contains("gzip")).Count() > 0)
return CompressionScheme.Gzip;
if (acceptableEncoding.Where(h => h.Value.Contains("deflate")).Count() > 0)
return CompressionScheme.Deflate;
return CompressionScheme.Identity;
}
你知道如何将压缩流分配给响应的内容吗?
我应该指出这是在IIS 6.0中托管的,我不能控制它。
发布于 2013-06-27 06:34:59
我认为您不应该在操作筛选器中这样做,因为模型绑定阶段发生在操作筛选器执行之前,并且在模型绑定期间,格式器可能正在读取流以对其进行反序列化,在这种情况下,它将失败。
如果您使用的是IIS,那么执行以下操作来设置压缩(下面是Scott Hanselman的blog post中的一些代码片段):
添加应用程序并关闭对话框后,请确保单击Apply Restart your IIS Service以加载新模块。
Accept-Encoding
标头发出请求,您应该会看到expected.
Accept-Encoding
=utf-8”以涵盖两种json格式)发布于 2018-05-20 22:43:29
如果您使用IIS设置压缩,则可以修改该文件:
C:\Windows\System32\inetsrv\config\applicationHost.config
添加以下标签
<dynamicTypes>
<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/atom+xml; charset=utf-8" enabled="true" />
<add mimeType="application/json" enabled="true" />
<add mimeType="application/json; charset=utf-8" enabled="true" />
<!--<add mimeType="application/*" enabled="true" />-->
<add mimeType="*/*" enabled="false" />
<staticTypes>
...
</staticTypes>
</dynamicTypes>
在部分中:
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
<!--
add here
-->
<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>
在添加了它们之后,重新启动来加载新模块。
可以通过修改标签来增加压缩级别:
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"
staticCompressionLevel="9" dynamicCompressionLevel="9" />
完成:)
PS:记住在IIS服务器的配置编辑器中启用路径system.webServer/httpCompression下的动态压缩
https://stackoverflow.com/questions/17321131
复制相似问题