javascript - 在 C# (WPF) 中解析 proxy.pac 文件

标签 javascript c# proxy.pac

我需要解析 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 引擎,读取或下载并读取文件,结果 = engine.evaluate(script)。然后他们可以使用这个结果对象以及新的 url 和主机等等。

为什么这些 JS 引擎都不知道 shExpMatch 方法?

最佳答案

API浏览器提供给 proxy.pac 代码的代码不属于 JavaScript 标准的一部分,因此诸如 Jint 和 V8 之类的通用 JavaScript 引擎不提供诸如 shExpMatch 之类的方法。浏览器(或其他主机)有责任公开此 API。

编辑:看看 Mozilla 的实现 here 。大部分都在 pacUtils 字符串中。您可以在 C# 代码中定义此字符串并将其传递到脚本引擎中。那就只剩下 dnsResolvemyIpAddressalert,所有这些都需要主机的帮助。这是一个 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 实现的链接。

关于javascript - 在 C# (WPF) 中解析 proxy.pac 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37563083/

相关文章:

javascript - 使用 AJAX 刷新的 Wicket 组件 "wicket:head"部分

javascript - Bootstrap css 影响单选按钮的行为

c# - 如何在基于 token 的身份验证的 ASP.Net WebAPI 2.0 中使用 Swagger

javascript - 如何调试用于 IE 代理设置的 Javascript proxy.pac 文件?

javascript - 如何在 lodash 版本 4 中获得 _.pick 功能

javascript - 在一个谷歌脚本下运行多个工作表,语法错误

c# - 我们如何访问和调用 Visual Studio API/函数,例如 "Find in All Files"。?

c# - 找不到命名空间名称 'DispatcherTimer'

java - Tomcat 6 - Java 代理隧道在 Windows 上失败 - 错误 - 407