C# WebRequest获取GZip页面

本文详细介绍了如何在HTTP响应中使用GZip压缩与解压缩技术来减少数据传输量,提高网络效率。通过在请求中设置Accept-Encoding头为gzip,deflate,并利用Stream和GZipStream类进行数据流操作,实现响应数据的高效压缩与解压。重点阐述了此技术的应用场景、具体实现步骤以及性能优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在请求中加入

request.Headers.Add("Accept-Encoding", "gzip, deflate");

响应中

Stream st = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);

只针对,响应中确实为GZip的情况。最好是判断响应头部的类型。

### C# 中 `WebRequest.Create` 方法的替代方案 在现代 .NET 应用程序开发中,推荐使用更高级别的 API 来处理 HTTP 请求。`HttpClient` 类提供了更好的性能和易用性,并且支持异步编程模型。 #### 使用 HttpClient 进行 GET 请求 ```csharp using System; using System.Net.Http; using System.Threading.Tasks; public class Program { public static async Task Main() { using var client = new HttpClient(); try { HttpResponseMessage response = await client.GetAsync("http://example.com"); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseBody); } catch (HttpRequestException e) { Console.WriteLine($"Request error: {e.Message}"); } } } ``` 此代码展示了如何创建一个简单的 GET 请求并读取响应内容[^1]。 #### 设置超时时间 对于设置请求超时的情况,可以配置 `HttpClientHandler` 或者直接通过 `HttpClient.Timeout` 属性来实现: ```csharp var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; handler.ServerCertificateCustomValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; // 忽略 HTTPS 证书错误 using var client = new HttpClient(handler) { BaseAddress = new Uri("http://example.com"), Timeout = TimeSpan.FromSeconds(20) // 设置全局超时时间为20秒 }; // 对于特定请求也可以单独设定超时 var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30)); HttpResponseMessage response = await client.GetAsync("/path", cts.Token); ``` 这段代码不仅设置了默认的连接超时,还展示了如何针对单个请求指定不同的超时时长以及如何忽略 SSL/TLS 验证失败的问题[^2]。 #### 发送 POST 数据 当需要发送数据给服务器时,比如执行 POST 操作,则可以通过如下方式构建请求体: ```csharp using System.Collections.Generic; using Newtonsoft.Json.Linq; JObject jsonContent = JObject.Parse(@"{""key"": ""value""}"); using var content = new StringContent(jsonContent.ToString(), Encoding.UTF8, "application/json"); HttpResponseMessage response = await client.PostAsync("/api/endpoint", content); if (response.IsSuccessStatusCode) { string result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); } else { Console.WriteLine($"Failed with status code: {(int)response.StatusCode}"); } ``` 上述例子说明了怎样序列化 JSON 格式的 payload 并将其作为 POST 请求的一部分提交出去[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值