Visual Studio 2019(.NET Framework Version 4.803752使用中)で、こんなエラーが出てきました。
「対象のコンピューターによって拒否されたため、接続できませんでした」
どうやら、TCP IP 接続を行うときの処理、下記のコードのところでエラーが出ている模様。
client.Connect(“localhost”, 80);
Visual Studio, C#, そして、ネットワークのことなんか全然これまでやってきたことがなかった私。何をどうしたらこのエラーが取れるのか、さっぱり分からず、いろいろとネットで調べました。
結果、エラーが取ることができました。調べた内容について書いておきます。
ちなみに、使用している教材やサンプルソースコードは、C#逆引き大全という本です↓
本書の422番目のサンプルソースコードを実行した時の話。
私も20年以上エンジニアやってきて、突然のプロジェクト解散なんて数年に1回経験しています。
急な転職活動によって企業側から足元を見られないようにするためにも、事前に転職サイトに登録しておいて情報収集しておくのは超重要。
登録者45万人以上いる
「対象のコンピューターによって拒否されたため、接続できませんでした」VisualStudioのclient.Connectのlocalhost 80でエラー出たときの対処法
まず結論から書いておきます。
Windows のコントロールパネルの下記のチェックボックスを入れることで解決しました↓
コントロールパネルの「プログラムと機能」を選択。
「Windowsの機能の有効化または無効化」をクリック。
その中で、.NET Framework3.5の欄で、
「Windows Communication Foundation HTTP アクティブ化」
「Windows Communication Foundation 非HTTP アクティブ化」(→こっちが直接解決の要因になっている模様)
をとりあえずチェックONにして、
「対象のコンピューターによって拒否されたため、接続できませんでした」
のエラーが取れました。
まず解決の結論は以上です。
ソースコードの引用をしておきます。
ソースコード引用元:現場ですぐに使える! Visual C# 2019逆引き大全 500の極意 No.422
- private void button1_Click(object sender, EventArgs e)
- {
- var client = new TcpClient();
- try
- {
- // TCP/IP接続を行う
- client.Connect(“localhost”, 80);
- // ストリームを取得する
- NetworkStream stream = client.GetStream();
- byte[] buffer = System.Text.Encoding.ASCII.GetBytes(
- “GET /start.htm HTTP/1.0\r\n\r\n”);
- stream.Write(buffer, 0, buffer.Length);
- // 正常に送信できた場合
- textBox1.Text = “正常に送信できました”;
- client.Close();
- }
- catch (Exception ex)
- {
- // 接続できなかった場合
- textBox1.Text = ex.Message;
- }
- }
- }
- }
「対象のコンピューターによって拒否されたため、接続できませんでした」のエラーを取るために調べたサイト引用
では、ここからは調べた内容について書いておきます。
まず、エラーを取ることができた直接のブログ記事がこちら、個人の方のブログ記事です。
結局たどり着いたのは、Windowsの機能の「Windows Communication Foundation Non-HTTP Activation」。
簡潔な解決方法のヒント、ありがたいです。
では、解決はしたはいいものの、
そもそもこの「HTTP アクティブ化」「HTTP アクティブ化」のチェックボックスをする、しないの意味は何なのか?
がよく分からないので Microsoft のホームページで調べた箇所について書いておきます。
まず 、Windows Communication FOUNDATION アクティブ化コンポーネントの説明については下記の通り。
Windows Communication Foundation (WCF) アクティブ化コンポーネントは、Windows プロセス アクティブ化サービスを使用してリモートからネットワーク経由でアプリケーションを呼び出します。
引用元:https://forsenergy.com/ja-jp/features/html/
edd9cfd7-e261-4f69-a918-eee86496d913.htm
Http アクティブ化については下記。
HTTP アクティブ化では、HTTP を使用したプロセスのアクティブ化がサポートされます。
引用元:https://forsenergy.com/ja-jp/features/html/
edd9cfd7-e261-4f69-a918-eee86496d913.htm
非HTTPアクティブ化については下記の通り
非 HTTP アクティブ化では、メッセージ キュー、TCP、または名前付きパイプを使用したプロセスのアクティブ化がサポートされます。
引用元:https://forsenergy.com/ja-jp/features/html/
edd9cfd7-e261-4f69-a918-eee86496d913.htm
この最後の非http アクティブ化のところに、
TCP を使用したプロセスのアクティブ化がサポートされます
と書いてあるので、
確かに
TCP IP 接続を行うときの処理
client.Connect(“localhost”, 80);
に関連している。なんとなく、http アクティブ化に関するインストールによって解決することが分かりました。
また、下記の Microsoft の下記のページも参考になります。
Windows プロセスアクティブ化サービス (WAS) をセットアップして、HTTP ネットワークプロトコルでは通信しない Windows Communication Foundation (WCF) サービスをホストするために必要
引用元:https://docs.microsoft.com/ja-jp/dotnet/framework/wcf/feature-details/how-to-install-and-configure-wcf-activation-components
さらに補足として、Microsoft のホームページにこのようなコメントも書いてあったので要点だけ引用しておきます↓
引用元:https://docs.microsoft.com/ja-jp/dotnet/framework/install/dotnet-35-windows-10
Windows Communication Foundation (WCF) 機能が必要な開発者またはサーバー管理者でない限り、 [Windows Communication Foundation HTTP アクティブ化] および [Windows Communication Foundation 非 HTTP アクティブ化] の子項目を選択する必要はありません。
Windows Communication FOUNDATION 機能が必要な開発者またはサーバー管理者以外
は、今回チェックした http アクティブ化、非http アクティブ化の項目を選択する必要はないとのこと。
確かに。私も例外ではなかったのですが Windows 10の PC を買った時に、
これらのチェックボックスはオンになっていませんでした。
通常はデフォルトでは、チェックが入ってないはずなので、
Visual Studioで今回実行したような、TCP 接続をする時
client.Connect(“localhost”, 80);
のようなコードを実行するときは、
チェックをしておく必要があるということ。
正直、細かいことは分かりません。
もう少し理解ができたら、今回の内容の追記もしていこうと思っています。
P.S
Visual Studio でC#の勉強を始めてするとき、下記の本が重宝しています。
サンプルソースコードが豊富なので、完成形から効率的に勉強できるので。
私も20年以上エンジニアやってきて、突然のプロジェクト解散なんて数年に1回経験しています。
急な転職活動によって企業側から足元を見られないようにするためにも、事前に転職サイトに登録しておいて情報収集しておくのは超重要。
登録者45万人以上いる