.NET HttpListener:HTTP と HTTPS の両方を登録すると、「マシン上の既存の登録との競合」が発生します。
-
26-09-2019 - |
質問
C# プロジェクトで .NET HttpListener を使用しようとしています。プレフィックス「http://*:8080/」を登録すると、HTTPS URL では機能しないようです(つまり、拾いません)。次のコードを実行してプレフィックスの HTTP バージョンと HTTPS バージョンの両方を登録しようとすると、エラーが発生します。
「プレフィックス 'https:// でリッスンできませんでした」:8080/' マシン上の既存の登録と競合するためです。」*
HTTP と HTTPS の両方でプレフィックスを機能させるにはどうすればよいですか?
private HttpListener _listener;
// Create prefixes
var prefixes = new List<string>();
prefixes.Add("http://*:8080/");
prefixes.Add("https://*:8080/");
// Create HttpListener
_listener = new HttpListener();
foreach (string prefix in prefixes)
{
_listener.Prefixes.Add(prefix);
}
_listener.Start(); // <== ERROR HERE
編集 1 - 追加の説明:
- このプログラムは、HTTP(S) 呼び出しを行う PC アプリケーションのローカル プロキシとして機能します。
- したがって、使用方法は、ブラウザのプロキシ設定を変更して、このローカルの自家製プロキシ サーバー (例:ローカルホスト:8080)
- したがって、これは、HttpListener がこの同じローカル ポートで HTTP トラフィックと HTTPS トラフィックの両方をリッスンする必要があることを意味します (例:8080)。
- 客観的:プログラムが同じポートで HTTP と HTTPS の両方をリッスンする方法を見つけてください。.
ありがとう
解決
客観的:私のプログラムが同じポートでHTTPとHTTPSの両方を聴く方法を見つけてみてください。
あなた できない これをHTTPListenerで行います。を使用する必要があります TCPリスナー HTTP か HTTPS かに応じて、各応答を条件付きで処理します。
HTTP 8080 に 1 つの HTTPListener を使用し、HTTPS 8443 に 1 つの HTTPListener を使用すれば、ブラウザで HTTP には yourproxy:8080 を使用し、HTTPS には yourproxy:8443 を使用できるはずです。Firefox なら間違いなくこれを実現できます。
他のヒント
、HTTPSあなたは異なるプロトコルリスタに別のポートを指定する必要がポート443ではなく80を使用しました。
これは非自明しかし、不可能ではないですね。あなたは、クライアントが送信するものを検査し、彼らが提供するデータに基づいて、HTTPまたはHTTPSセッションを開始しているかどうかを判断する必要があります。
編集:これについての思考はもう少しこれはあなたがプロキシを書いていることを考えると何をしたいのか、おそらくではありません。代わりに、あなたは( http://www.ietf.org/rfcを参照してくださいCONNECTメソッドを処理する必要があります。 /rfc2817.txt の)およびターゲットサーバへのトンネル接続を開きます。
「HTTPSを使用してHttpListenerをを作成する場合は、そのリスナーのためのサーバー証明書を選択する必要があります。それ以外の場合は、HttpWebRequestのクエリ本のHttpListenerを接続の予想外の近くで失敗します。」 これは、MSDNのサイトからです。 ( http://msdn.microsoft.com/en-us/ライブラリ/ system.net.httplistener.aspxする) たぶん、問題があるのでしょうか?
あなたはすべてのプロトコルに同じ設定を使用するように強制されていません。
ヒットは、プロキシの設定に進み、あなたが他のプロトコルのために、別のプロキシ設定が指定できます。