Tanaka Hiroshi (田中 寛志)さん、こんにちは。
Microsoft Q&A フォーラムにご投稿くださいましてありがとうございます。
PAC ファイルを直接ダウンロードして解析できます。PAC ファイルのプロキシ構成は通常、JavaScript を通じて実装され、ファイルを解析してその中のロジックを実行するには JS エンジンが必要です。
Jurassic
(.NET JavaScript エンジン) を使用して、PAC ファイル内の JavaScript コードを実行し、FindProxyForURL
関数を通じてプロキシ情報を取得できます。
using System;using System.Net;using System.Net.Http;using System.Threading.Tasks;using Jurassic;class Program{
static async Task Main(string[] args) { // PACファイルのURL
string pacUrl = "http://example.com/proxy.pac";
string targetUrl = "http://www.google.com"; // PACファイルの内容をダウンロード
string pacScript = await DownloadPacFile(pacUrl); // Jurassic JS エンジンを使用して PAC ファイルを実行し、プロキシ設定を取得します
string proxy = ExecutePacScript(pacScript, targetUrl); Console.WriteLine("Proxy: " + proxy); }
static async Task<string> DownloadPacFile(string pacUrl) {
using (HttpClient client = new HttpClient()) {
return await client.GetStringAsync(pacUrl); } }
static string ExecutePacScript(string pacScript, string targetUrl) { // 新しい JS エンジン インスタンスを作成する
var engine = new Jurassic.ScriptEngine(); // PACファイルの先頭にターゲットURLパラメータを追加します
string script = pacScript + $@" function FindProxyForURL(url, host) {{ return FindProxyForURL('{targetUrl}', '{new Uri(targetUrl).Host}'); }} "; // PAC ファイル内の FindProxyForURL 関数を実行します。 engine.Execute(script); // FindProxyForURL 関数を呼び出してプロキシ設定を取得します
string proxy = engine.CallGlobalFunction<string>("FindProxyForURL", targetUrl, new Uri(targetUrl).Host); return proxy; }}
FindProxyForURL
関数は、次の形式のような文字列を返します。
-
DIRECT
: プロキシを使用しません。 -
PROXY proxy.example.com:8080
: プロキシを使用proxy.example.com
、ポートは8080
。
この文字列を解析してプロキシのホスト名とポート番号を取得できます。
static (string host, int port) ParseProxyString(string proxy){ if (proxy.StartsWith("PROXY")) { string[] parts = proxy.Split(new[] { ' ', ':' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 3) { string host = parts[1]; int port = int.Parse(parts[2]); return (host, port); } } return (null, 0); // プロキシが見つからない場合は空を返します}
どうぞよろしくお願いいたします。