プロキシパックを利用したホスト名とポート番号の取得方法について

Tanaka Hiroshi (田中 寛志) 40 評価のポイント
2024-10-01T02:18:39+00:00

C#で、プロキシの設定として自動構成スクリプトの設定がされている際に、そのpacファイルから該当するホスト名とポート番号を取得したいです。

以下のようにすれば得たい情報を得られているのですが、GetSystemWebProxy()を利用せずに取得を行いたいです。

WebRequest.GetSystemWebProxy()).GetProxy(new Uri(targetAddress));

以下のようにすれば取得できると考えたのですが、同じ情報を得られませんでした。

Uri = proxyUri = "http::\------\proxy.pac"

WebProxy webproxy = new WebProxy(proxyUri);

Uri uri = webproxy.GetProxy(targetUri);

ご教授いただけますでしょうか。

C#
C#
C 言語ファミリをルーツとし、コンポーネント指向プログラミングのサポートを含む、オブジェクト指向およびタイプセーフのプログラミング言語。
37 件の質問
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. Wenying Lu-MSFT 2,075 評価のポイント Microsoft ベンダー
    2024-10-07T07:16:32.01+00:00

    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);  // プロキシが見つからない場合は空を返します}
    

    どうぞよろしくお願いいたします。

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません

0 件の追加の回答

並べ替え方法: 最も役に立つ

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。