ターゲットマシンがアクティブに拒否したため、接続できませんでしたか?


260

WebServiceに対してHttpWebRequestを実行しているときに、次のエラーが発生することがあります。以下のコードもコピーしました。


System.Net.WebException:リモートサーバーに接続できません---> System.Net.Sockets.SocketException:ターゲットマシンがアクティブに拒否したため、接続できませんでした127.0.0.1:80
   System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot、SocketAddress socketAddress)で
   System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)で
   System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure、Socket s4、Socket s6、Socket&socket、IPAddress&address、ConnectSocketState state、IAsyncResult asyncResult、Int32 timeout、Exception&exception)で
   ---内部例外スタックトレースの終了---
   System.Net.HttpWebRequest.GetRequestStream()で

ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

request.PreAuthenticate = true;
request.Credentials = networkCredential(sla);
request.Method = WebRequestMethods.Http.Post;
request.ContentType = "application/x-www-form-urlencoded";
request.Timeout = v_Timeout * 1000;

if (url.IndexOf("asmx") > 0 && parStartIndex > 0)
{
    AppHelper.Logger.Append("#############" + sla.ServiceName);

    using (StreamWriter reqWriter = new StreamWriter(request.GetRequestStream()))
    {                        
        while (true)
        {
            int index01 = parList.Length;
            int index02 = parList.IndexOf("=");

            if (parList.IndexOf("&") > 0)
                index01 = parList.IndexOf("&");

            string parName = parList.Substring(0, index02);
            string parValue = parList.Substring(index02 + 1, index01 - index02 - 1);

            reqWriter.Write("{0}={1}", HttpUtility.UrlEncode(parName), HttpUtility.UrlEncode(parValue));

             if (index01 == parList.Length)
                 break;

             reqWriter.Write("&");
             parList = parList.Substring(index01 + 1);
         }
     }
 }
 else
 {
     request.ContentLength = 0;
 }

 response = (HttpWebResponse)request.GetResponse();

1
Azureへの接続に遭遇しました。ターゲットマシンが使用可能であると言うのはかなり安全です。再起動してルーターをリセットしても問題が解決しない。変だ。問題?フィドラーは適​​切にシャットダウンしませんでした。システムは依然としてトラフィックをFiddlerを介してルーティングすることを期待しており、それが利用できない「ターゲットマシン」です。
Vok

これは使用されているソケットと関係があるのでしょうか?出口でそれらを閉じますか?
George Sp

回答:


204

これが常に発生する場合、それは文字通り、マシンは存在するが、指定されたポートでリッスンしているサービスがないか、ファイアウォールがユーザーを停止していることを意味します。

ときどき発生する-「ときどき」という言葉を使って-再試行が成功する場合は、サーバーに完全な「バックログ」があることが原因と考えられます。

acceptリスニングソケットでedされるのを待っているとき、バックログに置かれます。このバックログは有限で非常に短く、1、2、または3の値は珍しいことではないため、OSは、「受け入れ」が消費するリクエストをキューに入れることができない場合があります。

バックログはlisten関数のパラメーターです。C#の APIでも、すべての言語とプラットフォームでこのAPIは基本的に同じです。サーバーを制御する場合、このパラメーターは多くの場合構成可能であり、いくつかの設定ファイルまたはレジストリから読み取られる可能性があります。サーバーの構成方法を調べます。

サーバーを作成した場合、ソケットの受け入れで重い処理が行われる可能性があります。これを別のワーカースレッドに移動すると、受け入れが常に接続を受信できるようになります。クライアントのキューイングとそれらのシーケンシャルな処理を軽減する、さまざまなアーキテクチャの選択肢があります。

サーバーのバックログを増やすことができるかどうかに関係なく、この問題に対処するには、クライアントコードに再試行ロジックが必要です。長いバックログがあっても、その時点でサーバーはそのポートで他の多くの要求を受信して​​いる可能性があります。

マッピング用のポートが使い果たされた場合に、NATルーターがこのエラーを表示する可能性はまれです。ルーターは同じ宛先アドレス/ポートへの64Kの同時接続を使い果たしてしまうため、この可能性はあまりにも長すぎるものとして破棄できると思います。


はい、私は時々それを受け取ります。いつもではありません。理由はファイアウォールやその他のものではないと思いますが、バックログがこの問題の原因である可能性があります。この問題を解決する方法はありますか?
hsnkvk

@hsnkvk; 適切な堅牢な方法は、クライアントが再試行ループを持つことです。答えに応じて更新
ウィル

@意志; 私はすでにiterationCountを持っているので、失敗した場合はiterationCount回再試行します。:(
hsnkvk

1
それは事です。あなたが言ったように悪い設計/設定はかなりあいまいです。コードインスペクションとは、Webサービスを呼び出すコードを表示することを意味しますか?最初のWebサービスを呼び出すコードとまったく同じコードで投稿しなかったため、完全に機能しました。2番目のwebappに影響を与える可能性があるweb.configを介して構成できるサーバー上のプロパティはありますか?
Amith George

9
127.0.0.1:80は、Webサービスがローカルマシン上にあるため、ネットワークの問題が発生しやすくなっていることを示しています。テスト中にWebサービスの起動がクライアントアプリケーションよりも遅くなっていることは非常に好意的です。それでも、再試行ロジックを追加することは間違いなく進むべき道です。
Martin Brown

31

最も可能性の高い理由はファイアウォールです。

この記事には、いくつかの理由が含まれています。

記事から、考えられる理由は次のとおりです。

  • FTPサーバー設定
  • ソフトウェア/パーソナルファイアウォール設定
  • 複数のソフトウェア/パーソナルファイアウォール
  • ウイルス対策ソフト
  • LSPレイヤー
  • ルーターファームウェア
  • コンピュータの電源が切れました
  • コンピュータが接続されていません
  • バイオリン弾き

9
これは古いことですが、このリストにFiddlerを追加できます。アプリの起動中にフィドラーをデタッチしてから再接続すると、ソケットが正しく動作しました。
ps2goat

1
Fiddlerに
賛成

3
開発マシンにフィドラーをインストールしていたため、この問題が発生しました。この特定のプロジェクトを実行しているときにフィドラーを開いていなかったため、エラーが発生しました。プロジェクトの実行中にフィドラーを開いたところ、
うまくいき

16

これは私にも起こりました。プロジェクトを開くと、このエラーが表示されてイライラすることがあります。問題は、Webサービスのポート番号が予期せず変更されることがあったことです。

この問題は通常、プロジェクトのコピーが複数ある場合に発生します

私のプロジェクトは、メインプロジェクトファイルのWeb.Configファイルで割り当てた特定のポート番号でWebサービスを呼び出していました。ポート番号が予期せず変更されたため、ブラウザはWebサービスを見つけることができず、そのエラーをスローしました。

私は以下の手順に従ってこれを解決しました:(Visual Studio 2010)

Web serviceプロジェクトの[ プロパティ]に移動します-> [ Web ]タブをクリックします-> [ サーバー]セクションで-> [ 特定のポート を確認]をクリックしstandard port number、メインプロジェクトがWebサービスを呼び出すときに使用するを割り当てます。

これで問題が解決することを願っています。

乾杯:)


2
これは私には一般的な知識ではありませんでした。私のエラーがなぜ私に指定さLocalHost:2532れたのかについて、私は混乱してしまいました。あなたが指定したエリアの前の所有者によってそのように設定されたことがわかります。その謎が明らかになった今、それは他のいくつかのことを不思議でなくします。ありがとう!
Suamere 2014年

7

「インターネットオプション」でプロキシ設定を確認する必要があると思います。proxy / 'hide ip'アプリケーションを使用している場合、この問題が発生する可能性があります。


これはWindows 7の典型的な問題ですか?一部のデフォルトは他のWindowsバージョンと比較して異なりますか?
ウルフ、

@ウルフ、これはWindowsの問題ではないと思います。ただし、接続に問題がある可能性があります。
isaeid 2016年

IE->インターネットオプション->接続タブ-> LAN設定の順に進み、「LANにプロキシサーバーを使用する」のチェックを外します。これで問題が解決しました。
Mike Kuenzi

私のアプリケーションでは、ユーザーが必要とする可能性があるため、プロキシオプション(WPAD)を含めました。私はしません。しかし、私はテストコンピューターでそれをアクティブにしたので、失敗の原因となりました。したがって、プロキシを使用する必要がない場合は、アプリケーションでプロキシを定義しない可能性があります。
tmighty

4

私も同じ問題を抱えていました。問題は、セレンサーバーを起動しなかったことです。セレンサーバーをダウンロードして起動しました。セレンサーバーを起動した後、問題はなくなり、すべて正常に動作しました。

これを参照してください:http : //coding-issues.blogspot.in/2012/11/no-connection-could-be-made-because.html


1
質問はセレンサーバーについては何も触れていませんでした。
Geoff Dawdy 2014年

1
@GeoffDawdyこれは、Willの回答の理由1のもう1つの例です-繰り返しによる学習をサポートします;-)
Wolf

4

WCFプロジェクトに移動します-プロパティ-> ウェブ->デバッガー->チェックボックスをオフにします

エディットコンティニューを有効にする


10
これは何をしますか?
Wouter Vanherck

3

Net TCPバインディングを使用するWCFサービスで同じエラーが発生しましたが、私の場合、以下のサービスを開始した後で解決しました。

Net.Pipe.Listener.Adapter

Net.TCP.Listener.Adapter

Net.Tcpポート共有サービス


1
素晴らしい、髪を抜いていた。脚注:WCF NET.TCPサービスをWindows 7 PCで実行する場合、これら3つのサービスを実行する必要はありませんでした。ただし、Windows Server上で実行されている(私は2003年と2008年をテストした)これらのサービスは持っていた WCFが正しいのことができるようにするために実行されています。
にやにや笑い者

3

これは非常に具体的ですが、mongoを使用してデータベースに接続しようとした後にこのエラーが発生した場合、mongo.exeを実行する前にmongod.exeを実行すると、接続が正常に機能しました。これが誰かを助けることを願っています。


3

サーバーとクライアントが同じマシンで実行されている場合、クライアントはサーバーと通信するためにサーバーのローカルIPアドレスではなくパブリックIPアドレスを必要とするため、同じエラーに直面しましたクライアントプログラムでサーバーに接続するにはローカルIPアドレスはこの方法を使用して見つけることができます。

 public static string Getlocalip()
    {
        try
        {
            IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
            return localIPs[7].ToString();
        }
        catch (Exception)
        {

            return "null";
        }

    }

それが私のシナリオでした。代替の修正として、パブリックIPに解決されるホスト名をポイントしている場合は、サーバーマシンのHOSTファイルを編集して、ホスト名を127.0.0.1にルーティングするルールを追加することもできます。
Darkseal 2017年

3

AppFabricを使用するアプリケーションでこのエラーが発生しました。手がかりがDataCacheExceptionスタックトレースに含まれていました。これが問題であるかどうかを確認するには、次のPowerShellコマンドを実行します。

@("AppFabricCachingService","RemoteRegistry") | % { get-service $_ }

これら2つのサービスのいずれかが停止している場合、このエラーが発生します。


ありがとう。余談ですが、私自身や他の人への将来の参照のために、サービスを開始したときに機能するように見えましたが、アプリはあらゆる種類の速度低下を抱えていて、ついにAppFabricの他のサーバー上のサービスクラスタはオンになりませんでした。
マーク・

2

さて、私は今日、突然、Windows 8 64ビットでこのエラーを初めて受け取りましたが、my.iniがリセットされ、bin / mysqldファイルが削除されていることがわかりました。で"Program Files/MySQL/MySQL Server 5.6"フォルダ。

それを修正するために、私は、サーバーをインストールし、再度、MySQLのインストーラを実行しなければならなかった、とのmy.iniファイルの最新バージョンをコピーし"ProgramData/MySQL/MySQL Server 5.6"、名前のmy_2014-03-28T15-51-20.ini私の場合には(そう、最近そこにコピー得たことをどのようにか、なぜ知りません)に戻る"Program Files/MySQL/MySQL Server 5.6"

MySQLが機能してからシステムに加えられた唯一の変更は、Native InstrumentsのTraktor 2とTraktor Audio 2サウンドカードのインストールでしたが、実際にはこの問題の原因ではなく、私以外の誰もシステムを使用していません。誰かが手がかりを持っているなら、私とこれに遭遇した他の誰にとってもこれを防ぐためにコメントするのはあなたのようなものです。


私は同じ問題を抱えていましたが、解決するには、services.mscを介してMyQslサービスを停止する必要があります。ただし、それ以降はMySqlを使用できないため、コンピューターを再起動して再度取得する必要があります。
ガブリエル

2

ソリューション内のサービス参照用。

  1. ワークステーションを再起動します

  2. ソリューションを再構築する

  3. WCFclientプロジェクトのサービス参照を更新する

この時点で、システムアクセスを許可するメッセージ(Windows 7)を受け取りました。次に、サービス参照がエラーなしで適切に更新されました。


2

問題の原因がファイアウォールまたはプロセスが正しくリッスンしていないために見つけたこの回答を共有したいと思います。それは、私が使用したのはマイクロソフトから提供されたコードサンプルでした。

https://msdn.microsoft.com/en-us/library/system.net.sockets.socket%28v=vs.110%29.aspx

私はこの関数を記述されたとおりに実装しましたが、何が起こったのでしょうか。

2016-01-05 12:00:48,075 [10]エラー-エラーは次のとおりです:System.Net.Sockets.SocketException(0x80004005):ターゲットマシンがアクティブに拒否したため、接続を確立できませんでした[fe80 :: caa:745: a1da:e6f1%11]:4080

このコードは、ソケットが接続されているが、適切な通信に実際に必要な正しいIPアドレスではないことを示します。(マイクロソフト提供)

private static Socket ConnectSocket(string server, int port)
    {
        Socket s = null;
        IPHostEntry hostEntry = null;

        // Get host related information.
        hostEntry = Dns.GetHostEntry(server);

        // Loop through the AddressList to obtain the supported AddressFamily. This is to avoid
        // an exception that occurs when the host IP Address is not compatible with the address family
        // (typical in the IPv6 case).
        foreach(IPAddress address in hostEntry.AddressList)
        {
            IPEndPoint ipe = new IPEndPoint(address, port);
            Socket tempSocket = 
                new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            tempSocket.Connect(ipe);

            if(tempSocket.Connected)
            {
                s = tempSocket;
                break;
            }
            else
            {
                continue;
            }
        }
        return s;
    }

見つかった最初の有効なIPのみを使用するようにコードを書き直しました。私はこれを使用するIPV4だけに関心がありますが、それはlocalhost、127.0.0.1、およびMicrosoftによって提供された例が失敗したネットワークカードの実際のIPアドレスで動作します!

    private Socket ConnectSocket(string server, int port)
    {
        Socket s = null;

        try
        {
            // Get host related information.
            IPAddress[] ips;
            ips = Dns.GetHostAddresses(server);

            Socket tempSocket = null;
            IPEndPoint ipe = null;

            ipe = new IPEndPoint((IPAddress)ips.GetValue(0), port);
            tempSocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            Platform.Log(LogLevel.Info, "Attempting socket connection to " + ips.GetValue(0).ToString() + " on port " + port.ToString());
            tempSocket.Connect(ipe);

            if (tempSocket.Connected)
            {
                s = tempSocket;
                s.SendTimeout = Coordinate.HL7SendTimeout;
                s.ReceiveTimeout = Coordinate.HL7ReceiveTimeout;
            }
            else
            {
                return null;
            }

            return s;
        }
        catch (Exception e)
        {
            Platform.Log(LogLevel.Error, "Error creating socket connection to " + server + " on port " + port.ToString());
            Platform.Log(LogLevel.Error, "The error is: " + e.ToString());
            if (g_NoOutputForThreading == false)
                rtbResponse.AppendText("Error creating socket connection to " + server + " on port " + port.ToString());
            return null;
        }
    }

2

私の場合、一部のドメインは機能しましたが、一部は機能しませんでした。web.configに組織のプロキシURLへの参照を追加すると、問題が解決しました。

<system.net>
    <defaultProxy useDefaultCredentials="true">
      <proxy proxyaddress="http://proxy.my-org.com/" usesystemdefault="True"/>
    </defaultProxy>
</system.net>

1

私のWeb層からWCFHostにあるサービスを参照すると、このエラーが発生します。私のために働いたことはすべての人に当てはまるわけではありませんが、私はそれがそうかもしれない人々のためにこの答えを残します。WCFHostのポート番号はIISによってランダムに更新されました。Web構成のsvc参照へのエンドルートを更新するだけで済みました。問題が解決しました。


1

私のシナリオでは、2つのアプリケーションがあります。

  • アプリ1
  • アプリ2

仮定:App1はポート5000でのApp2のアクティビティをリッスンする必要があります

エラー:App1を起動して、存在しないゴーストタウンを聴こうとすると、エラーが発生します

解決策:最初にApp2を起動してから、App1を使用して聞いてみます


1

もう1つの可能性-

聞いている場所と同じIPアドレスを開こうとしていることを確認してください。サーバーアプリはIPv6を使用してホストマシンのIPアドレスをリッスンしていましたが、クライアントはホストマシンのIPv4アドレスで接続を試みていました。


1

私の場合、これは、web.configの設定が行われていないデプロイメントの失敗が原因でした。

同僚は、エラーメッセージのIPアドレスがローカルホストを表していると説明しました。

web.configを修正すると、正しいURLを使用してサーバー呼び出しが行われ、機能しました。

誰かを助けるかもしれないので、私はこれを投稿すると思いました。


0

Windows 7 Home Premium 64ビットでWampServer 64ビットを使用するこの問題が発生しました。何時間もの実験を繰り返した結果、必要なのはmy.iniで1行コメント化するだけであることが明らかになりました。その後、うまくいきました。

1行のsocket = mysqlをコメント化

古い/ data /ファイルを適切な場所に配置すると、WampServerは、上書きする/ mysql /フォルダーを除くすべてのファイルを受け入れます。そのため、以前の開発環境から/ mysql /ユーザーデータのバックアップをインポートし、phpMyAdmin SQLウィンドウでFLUSH PRIVILEGESを実行しました。よく働く。物事はこれほど簡単ではないはずなので、何かが間違っている必要があります。


0

この問題は頻繁に発生していました。SQL Server Agentサービスが実行されていないことがわかりました。サービスを手動で開始すると、修正されました。サービスが実行されているかどうかを再確認します。

  1. プロンプトを実行し、入力します services.msc入力してEnter
  2. サービス名を見つける- SQL Server Agentインスタンス名

SQL Server Agentが実行されていない場合は、サービスをダブルクリックしてプロパティウィンドウを開きます。次に、Startボタンをクリックします。それが誰かを助けることを願っています。


SQL ServerエージェントがIISと何か関係があるのはなぜですか?多分あなたはWWWサービスを意味しましたか?
Nick.McDermaid

0

私はこのエラーに出くわし、それを解決するのに少し時間がかかりました。私の場合、同じポートでIISバインディングとしてhttpsとnet.tcpを構成しました。もちろん、同じポートに2つのものを置くことはできません。netstat -ap tcpコマンドを使用して、そのポートで待機しているものがあるかどうかを確認しました。誰も聞いていませんでした。不要なバインディング(私の場合はhttps)を削除すると、問題が解決しました。


0

それは私の側で愚かな問題でした、私はFiddlerでトラフィックをインターセプトするために私のweb.configにdefaultproxyを追加し、それを削除するのを忘れていました!


0

SQL Server接続情報をクライアントに提供する「SQL Server Browser」と呼ばれるサービスがあります。

私の場合、このサービスが実行されていなかったため、既存のソリューションはどれも機能しませんでした。私はそれを再開し、すべてが完全に機能するように戻りました。


0

今日この問題に直面していた。鉱山はAsp.Net Core APIでPostgresql、データベースとして使用しています。このデータベースをDockerコンテナーとして構成しました。したがって、最初に行ったのは、データベースにアクセスできるかどうかを確認することでした。これを行うPgAdminには、同じように構成したので、最初に検索しました。結果のアプリケーションをクリックすると、http://127.0.0.1:23722/browser/にリダイレクトされます。そこで、左側のメニューからデータベースにアクセスしてみてください。私にとっては、下の画像のようにエラーが発生しました。

ここに画像の説明を入力してください

パスワードを入力し、アクセスできるかどうかを試します。私にとっては、うまくいきませんでした。これはDockerコンテナーなので、Dockerデスクトップを再起動することにしました。これを行うには、タスクバーのDockerアイコンを右クリックして、[再起動]をクリックします。

Dockerを再起動した後、ログインしてデータベースを表示でき、Visual Studioでアプリケーションを再起動するとエラーが発生しなくなりました

それが役に立てば幸い。


0

認可の問題が原因である可能性があります。私にとってはそうでした。たとえば:[Authorize("WriteAccess")]または[Authorize("ReadAccess")]コントローラー関数の上部にある場合は、コメント化してみてください。


0

私にとっては、モンゴをシェルで起動したいと思いました(質問の正確なコンテキストとは関係ありませんが、モンゴをシェルで起動する前に同じエラーメッセージが表示されました)

プロセス「MongoDB Service」はサービスで実行されていませんでした

管理者としてcmdを起動し、次のように入力します。

net start MongoDB

MongoDBが稼働中であることを確認するには、「mongo」と入力します。cmdでは、Mongoバージョンの詳細とMongo接続URLが表示されます


0

私は今これに直面しました...

ここに画像の説明を入力してください

ここでは、2つのVisual Studioソリューション(.sln)を分離しています...それぞれを独自のVisual Studioインスタンスで開きました。

ソリューション2はソリューション1コードを呼び出します。問題はソリューション1に割り当てられたポートに関連していました。ソリューション1のポートを別のポートに変更する必要があり、その後ソリューション2が再び機能し始めました。したがって、プロジェクトに割り当てられているポートを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.