gpt4 book ai didi

c# - 如何在客户端解压 Html 页面

转载 作者:行者123 更新时间:2023-11-30 12:16:53 26 4
gpt4 key购买 nike

我从这个 article 中获取了这个代理代码并创建为 HttpHandler

public void ProcessRequest(HttpContext context)
{
string url = context.Request["url"];
string contentType = context.Request["type"];

// no buffering as we want to save memory
context.Response.Buffer = false;

// beging getting content
using (WebClient client = new WebClient())
{

// set content type if specified
if (!string.IsNullOrEmpty(contentType))
{
client.Headers.Add(HttpRequestHeader.ContentType, contentType);
}

client.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
client.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US");
client.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows; U; Windows NT 6.0; " +
"en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
client.Headers.Add(HttpRequestHeader.Accept, "*/*");

// get that data
byte[] data = client.DownloadData(url);

if (!context.Response.IsClientConnected) return;

// deliver content type, encoding and length as it
// is received from the external url
context.Response.ContentType = client.ResponseHeaders["Content-Type"];

string contentEncoding = client.ResponseHeaders["Content-Encoding"];
string contentLength = client.ResponseHeaders["Content-Length"];

if (!string.IsNullOrEmpty(contentEncoding))
context.Response.AppendHeader(HttpRequestHeader.ContentEncoding.ToString(), contentEncoding);

if (!string.IsNullOrEmpty(contentLength))
context.Response.AppendHeader(HttpRequestHeader.ContentLength.ToString(), contentLength);


// transmit the exact bytes downloaded
context.Response.BinaryWrite(data);


}
}

我在 IIS7 中将此 Http 模块映射为托管处理程序,在我的纯 Html 页面中,我使用 jQuery 调用代理并将结果放入 iframe。

$(document).ready(function() {
$.ajax({
type: "GET",
url: "a.RegularProxy",
data: { url: 'http://example.org/test.html', type: "text/html" },
dataType: "html",
success: function(data) {
$("iframe").contents().find('html body').html(data.toString());
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(errorThrown);
}
});
});

当页面漂亮且简单时一切正常,但是如果页面被压缩(gzip、deflate)我需要找到一种方法来在客户端解压缩它而不是在代理中- 代理的功能是尽可能快。

最佳答案

浏览器根据 HTTP header 自动执行解压缩。

我怀疑正在发生的事情是 WebClient 自动解压缩从上游服务器接收到的响应。然后您的代码将解压缩的信息传输到客户端,但告诉客户端数据已压缩。

没有办法直接告诉 WebClient 不要解压缩。您必须创建派生的 WebClient 类并覆盖 GetWebRequest 方法。在该方法中,您告诉 HttpWebRequest 不要解压缩。它看起来像这样:

public class MyWebClient: WebClient
{
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest wr = base.GetWebRequest(address);
wr.AutomaticDecompression = DecompressionMethods.None;
return wr;
}
}

然后,您使用 MyWebClient 代替 WebClient:

using (MyWebClient client = new MyWebClient)
{
// do your thing here
}

关于c# - 如何在客户端解压 Html 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4510538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com