我需要在C#代码中解析proxy.pac。通过WebProxy方法获取代理不是一种选择,因为我从文件中读取代理设置,而不是从当前系统中读取代理设置。
我尝试使用Jint和ClearScript在C#代码中使用嵌套的JavaScript引擎。但最终都未能在我的proxy.pac中读取“shExpMatch”方法。
该文件非常简单,适用于我当前的系统:
function FindProxyForURL(url, host) {
if (shExpMatch(host, "192.*")) {
return "DIRECT";
}
return "PROXY proxyServer:8080; PROXY proxyServer2:80";
}
此工具的旧实现使用的是Microsoft.JScript.Vsa.VsaEngine.CreateEngine();自Visual Studio 2005(10年以前!)以来已被弃用,他们所做的只是:启动JS引擎,读取或下载并读取文件,result = engine.evaluate(script)。然后他们可以将这个结果对象与新的url和hostetvoilà一起使用。
为什么这些JS引擎都不知道shExpMatch方法?
答案 0 :(得分:2)
浏览器可用于proxy.pac代码的API不是JavaScript标准的一部分,因此诸如Jint和V8之类的通用JavaScript引擎不提供shExpMatch
等方法。浏览器(或其他主机)有责任公开此API。
编辑:看看Mozilla的实施here。大多数都在pacUtils
字符串中。您可以在C#代码中定义此字符串并将其传递到脚本引擎中。这将离开dnsResolve
,myIpAddress
和alert
,所有这些都需要主机的帮助。这是一个ClearScript示例:
Func<string, string> dnsResolve = name => {
var addrs = Dns.GetHostEntry(name).AddressList;
return addrs.First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString();
};
engine.Execute(pacUtils);
engine.Script.dnsResolve = dnsResolve;
engine.Script.myIpAddress = new Func<string>(() => dnsResolve(Dns.GetHostName()));
engine.Script.alert = new Action<string>(msg => Console.WriteLine("PAC-alert: " + msg));
设置完成后,您应该能够执行proxy.pac代码。
[Edit2:]更新了Mozilla实施的链接。