好的,简单的问题,但在我开始之前需要一些解释。
我正在尝试使用 System.Net.WebClient (或 WebRequest,相同的结果)通过代理服务器下载 https 页面。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3
{
static class Program
{
static void Main(string[] args)
{
var wc = new WebClient();
wc.Proxy = new WebProxy("MyProxyAddress") { UseDefaultCredentials = true };
wc.Headers.Add("xyz", "abc");
try
{
Console.WriteLine(wc.DownloadString("https://www.google.co.nz"));
}
catch (WebException wex)
{
if (wex.Response != null)
using (var reader = new StreamReader(wex.Response.GetResponseStream()))
Console.WriteLine(reader.ReadToEnd());
}
}
}
}
如果我此时启动 Fiddler,我可以看到请求如下所示。请注意,我已将 Fiddler 设置为需要代理身份验证。
CONNECT www.google.co.nz:443 HTTP/1.1
Host: www.google.co.nz
Proxy-Connection: Keep-Alive
回应将是
HTTP/1.1 407 Proxy Auth Required
Connection: close
,正如预期的那样。如果我将地址从 https://... 更改为 http://...,我会得到这个。请注意,现在显示 xyz 标头
GET http://www.google.co.nz/ HTTP/1.1
xyz: abc
Host: www.google.co.nz
Proxy-Connection: Keep-Alive
一切都很好,除非我正在通过的代理需要用户代理。包括我的 User-Agent 在内的所有标头都从请求中删除,因此代理拒绝了该请求。如果我将 Fiddler 配置为强制将 User-Agent 标头放入请求中,则一切正常。
那么,为什么我的标头没有包含在 CONNECT 请求中?这是一个 MS 错误,还是我错过了什么?