2016-06-01 22 views
0

我需要解析C#代碼中的proxy.pac。通過WebProxy-method獲取代理不是一種選擇,因爲我從文件讀取代理設置,而不是從當前系統讀取代理設置。解析C#中的proxy.pac文件(WPF)

我試過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和host etvoilà。

爲什麼這些JS引擎都不知道shExpMatch方法?

+0

這與WPF有什麼關係? – MickyD

+0

這是C#WPF,而不是C#WinForms,C#通用應用程序。可能有解決方案適用於1個平臺,但不適用於另一個平臺。爲了說清楚,我將它標記爲WPF。 – ecth

+0

正如我所說的,我不明白這與_Windows Presentation Foundation _ – MickyD

回答

1

API瀏覽器提供給proxy.pac的代碼不是JavaScript標準的一部分,所以通用JavaScript引擎如Jint和V8不提供諸如shExpMatch的方法。瀏覽器(或其他主機)負責公開此API。

編輯:看看Mozilla的實施here。它大部分位於pacUtils字符串中。您可以在您的C#代碼中定義此字符串並將其傳遞到腳本引擎中。這隻會留下dnsResolve,myIpAddressalert,所有這些都需要主機的幫助。這裏是一個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代碼。

+0

非常有意義。但有什麼辦法可以很好地做到這一點? VsaEngine剛剛使用了''Eval(腳本,引擎)'',工作完成了。 – ecth

+0

我在上面的答案中添加了一個可能的解決方案。 – BitCortex

+0

謝謝,我已將此標記爲答案,因爲它實際上可能會幫助人們。我將使用此WinApi調用:https://msdn.microsoft.com/de-de/library/windows/desktop/aa384097%28v=vs.85%29.aspx包括編組,但它能夠下載,閱讀和解析proxy.pac就像我需要它:)但是,在我的項目中使用Mozilla基金會代碼將是非常棒! – ecth