Mis*_*pic 19 asp.net-mvc asp.net-web-api
我一直在为我的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;
}
Run Code Online (Sandbox Code Playgroud)
有关如何将压缩流分配给响应内容的任何想法?
我应该指出这是在IIS 6.0中托管,我无法控制.
Kir*_*lla 50
我想你应该不作为动作过滤器在执行之前的modelbinding阶段发生在一个动作过滤器做到这一点,modelbinding格式化程序可以读取流反序列化,在这种情况下,它会失败时.
如果您使用的是IIS,请执行以下操作以设置压缩(以下是Scott Hanselman 博客文章中的一些片段):
在IIS中启用"动态压缩"功能.
返回IIS管理器,转到SERVER的页面,而不是SITE.单击配置编辑器:
从下拉列表中选择system.webServer/httpCompression:


现在使用Accept-Encoding标头发出请求,您应该按预期看到响应.
编辑(除了上面包括"application/json; charset = utf-8"以涵盖两种json格式)
| 归档时间: |
|
| 查看次数: |
17392 次 |
| 最近记录: |