Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有人使用ASP.NET进行过HTTP压缩吗?_Asp.net_Http_Compression_Gzip - Fatal编程技术网

有人使用ASP.NET进行过HTTP压缩吗?

有人使用ASP.NET进行过HTTP压缩吗?,asp.net,http,compression,gzip,Asp.net,Http,Compression,Gzip,我在这方面花了不少时间,但似乎什么也没做。我有一个很大的页面,我真的想加快速度。显然,应该从HTTP压缩开始,但我似乎无法让它为我工作 经过大量搜索,我尝试了下面代码的几种变体。它可以正常工作,但在刷新浏览器后,结果似乎会崩溃。当页面使用缓存时,他们变成了垃圾。如果我关闭缓存,那么页面看起来是正确的,但我丢失了CSS格式(存储在单独的文件中),并得到一个错误,即包含的JS文件包含无效字符 我在网上找到的大多数资源要么非常陈旧,要么主要用于直接访问IIS。我的页面运行在共享主机帐户上,我没有直接访

我在这方面花了不少时间,但似乎什么也没做。我有一个很大的页面,我真的想加快速度。显然,应该从HTTP压缩开始,但我似乎无法让它为我工作

经过大量搜索,我尝试了下面代码的几种变体。它可以正常工作,但在刷新浏览器后,结果似乎会崩溃。当页面使用缓存时,他们变成了垃圾。如果我关闭缓存,那么页面看起来是正确的,但我丢失了CSS格式(存储在单独的文件中),并得到一个错误,即包含的JS文件包含无效字符

我在网上找到的大多数资源要么非常陈旧,要么主要用于直接访问IIS。我的页面运行在共享主机帐户上,我没有直接访问IIS7的权限,而IIS7正在运行

protected void Application_BeginRequest(object sender, EventArgs e)
{
    // Implement HTTP compression
    if (Request["HTTP_X_MICROSOFTAJAX"] == null) // Avoid compressing AJAX calls
    {
        // Retrieve accepted encodings
        string encodings = Request.Headers.Get("Accept-Encoding");
        if (encodings != null)
        {
            // Verify support for or gzip (deflate takes preference)
            encodings = encodings.ToLower();
            if (encodings.Contains("gzip") || encodings == "*")
            {
                Response.Filter = new GZipStream(Response.Filter,
                    CompressionMode.Compress);
                Response.AppendHeader("Content-Encoding", "gzip");
                Response.Cache.VaryByHeaders["Accept-encoding"] = true;
            }
            else if (encodings.Contains("deflate"))
            {
                Response.Filter = new DeflateStream(Response.Filter,
                    CompressionMode.Compress);
                Response.AppendHeader("Content-Encoding", "deflate");
                Response.Cache.VaryByHeaders["Accept-encoding"] = true;
            }
        }
    }
}

有谁在这方面取得了更好的成功吗?

我使用
GZipStream
deflatesttream
直接编写输出,但我不熟悉
Response.Filter
属性。试一试:

string response = "your output body";
string accept = Request.Headers["Accept-Encoding"];
if(accept == null) accept = "";
if (response.Length < 100 || !(accept.Contains("deflate") || accept.Contains("gzip")))
    Response.Write(response);
else
{
    byte[] compressed;
    bool useDeflate = accept.Contains("deflate");
    using (MemoryStream stream = new MemoryStream())
    {
        using (Stream deflate = useDeflate
            ? (Stream)new DeflateStream(stream, CompressionMode.Compress, true)
            : (Stream)new GZipStream(stream, CompressionMode.Compress, true))
        using (StreamWriter writer = new StreamWriter(deflate))
            writer.Write(response);
        compressed = new byte[stream.Length];
        stream.Position = 0;
        stream.Read(compressed, 0, compressed.Length);
    }
    Response.Headers["Content-Encoding"] = useDeflate ? "deflate" : "gzip";
    Response.BinaryWrite(compressed);
}
string response=“您的输出主体”;
字符串accept=Request.Headers[“accept Encoding”];
如果(accept==null)accept=“”;
if(response.Length<100 | | |!(accept.Contains(“deflate”)| | accept.Contains(“gzip”))
响应。写入(响应);
其他的
{
字节[]压缩;
bool useDeflate=accept.Contains(“deflate”);
使用(MemoryStream stream=new MemoryStream())
{
使用(流放气=使用放气
?(流)新的deflatestStream(流,压缩模式。压缩,真)
:(Stream)新的gzip流(Stream,CompressionMode.Compress,true))
使用(StreamWriter=新StreamWriter(deflate))
写作(回应);
压缩=新字节[stream.Length];
流位置=0;
stream.Read(压缩、0、压缩、长度);
}
Response.Headers[“Content Encoding”]=useDeflate?“deflate”:“gzip”;
二进制写入(压缩);
}

应用程序_BeginRequest()中是否也有此功能?遗憾的是,我只参与过一个ASP.Net项目,一直以来都是.ashx IHttpHandler,它允许您将整个响应正文视为字符串(如果您愿意)。我真的不知道它是如何在常规的.aspx页面中完成的。我研究过的所有其他C#都是Win32之类的东西。如果ASP.Net具有某种输出缓冲机制,则此代码将在刷新之前对其进行处理。。。不管在哪里。对不起,我不能说得更具体了!