5

私のコンピューターは、ポート 80 を (ポート 80 として) 転送するルーターの背後にあります。私の問題は、HttpListener が外部 IP アドレス宛てのリクエストを無視しているように見えることです。

問題はルーターではありません。空の C# コンソール プロジェクトを作成し、次のコード行のみを追加するとします。

System.Net.Sockets.TcpListener s = new System.Net.Sockets.TcpListener(System.Net.IPAddress.Any, 80);
s.Start();
System.Net.Sockets.TcpClient c = s.AcceptTcpClient();

...そしてプログラムを実行します[注: このプログラムを初めて実行するとき、ユーザーはファイアウォールの例外を許可する必要がある場合があります]、に移動すると終了します

http://localhost/testpath/

ブラウザで、またはに移動した場合

http://externalipaddress/testpath/

私のブラウザでは、どちらのアドレスもポート 80 接続を正常に試行します。これで、すべてが適切に設定されました。このコンピュータは、ポート 80 で内部接続と外部接続を受け入れることができます。

ここで、別の空の C# コンソール プロジェクトを作成し、次のコード行のみを追加するとします。

System.Net.HttpListener s = new System.Net.HttpListener();
s.Prefixes.Add("http://+:80/testpath/");
s.Start();
System.Net.HttpListenerContext c = s.GetContext();

...最初に、この質問で言及されている問題のためにアクセスが拒否されたことを示す HttpListenerException が表示されます。その後、Visual Studio を閉じて管理者として再度開くと、正しく実行されます。に移動すると、プログラムは(適切に)終了します

http://localhost/testpath/

ただし、に移動すると、リクエストがタイムアウトするだけです

http://externalipaddress/testpath/

HttpListener への外部リクエストがタイムアウトになるのはなぜですか? 結果は、「externalipaddress」の数値 IP アドレスまたはドメイン名、サブフォルダー、スラッシュなどの多くの順列、およびプレフィックス「http://*:80/testpath/」、「http: //externaldomain:80/testpath/" および "http: //externalipaddress:80/testpath/" (スペースなし。stackoverflow フォーマット用に追加)。

4

1 に答える 1

8

Windows ファイアウォールが、localhost の外部からの着信ポート 80 要求を黙って食べていたことが判明しました。ファイアウォールを無効にすると、HttpListener が外部要求を検出しました。ファイアウォールを再度有効にすると、HttpListener は外部要求の検出を停止しました。SYSTEM プログラム (HttpListener をリッスンする TCP を実行するサービスをホストする) がポート 80 でリッスンできるようにする "BranchCache Content Retrieval (HTTP-In)" という無効なインバウンド ルールを有効にすると、HttpListener は再び外部要求を検出しました。

Windows 7 で受信の規則の一覧を確認するには、[スタート] -> [コントロール パネル] -> [システムとセキュリティ] -> [Windows ファイアウォール] -> [詳細設定] -> [受信の規則] を選択します。

于 2013-07-24T02:56:40.773 に答える