Yhteyttä ei voitu muodostaa, koska kohdekone kieltäytyi siitä aktiivisesti?

Joskus saan seuraavan virheilmoituksen, kun tein HttpWebRequest-pyyntöä WebService-palveluun. Kopioin myös alla olevan koodini.


System.Net.WebException: SocketException: System.Net.Sockets.SocketException: Ei voida muodostaa yhteyttä etäpalvelimeen ---> System.Net.Sockets.SocketException: Ei voida muodostaa yhteyttä etäpalvelimeen ---> System.Net.Sockets.SocketException: Yhteyttä ei voitu muodostaa, koska kohdekone kieltäytyi aktiivisesti 127.0.0.0.1: 80
   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)
   at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)
   --- Sisäisen poikkeuksen pinojäljen loppu ---
   at 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();

Jos tämä tapahtuu aina, se tarkoittaa kirjaimellisesti, että kone on olemassa, mutta sillä ei ole palveluita, jotka kuuntelevat määritettyä porttia, tai että palomuuri estää sinua.

Jos se tapahtuu satunnaisesti - käytit sanaa "joskus" - ja uudelleen yrittäminen onnistuu, se johtuu todennäköisesti siitä, että palvelimella on täysi 'backlog'.

Kun odotat, että sinut "hyväksytään" kuuntelevassa socketissa, joudut backlogiin. Tämä ruuhka on rajallinen ja melko lyhyt - arvot 1, 2 tai 3 eivät ole epätavallisia - joten käyttöjärjestelmä ei ehkä pysty asettamaan pyyntöäsi jonoon 'accept':n kuluttamista varten.

Backlog on listen-funktion parametri - kaikilla kielillä ja alustoilla on periaatteessa sama API tässä suhteessa, jopa C#:lla. Tämä parametri on usein konfiguroitavissa, jos hallitset palvelinta, ja se luetaan todennäköisesti jostain asetustiedostosta tai rekisteristä. Tutki, miten palvelimesi konfiguroidaan.

Jos olet kirjoittanut palvelimen, sinulla saattaa olla raskasta käsittelyä socketin acceptissa, ja tämä voidaan paremmin siirtää erilliseen worker-threadiin, jotta accept on aina valmis vastaanottamaan yhteyksiä. Voit tutkia erilaisia arkkitehtuurivaihtoehtoja, jotka vähentävät asiakkaiden jonottamista ja peräkkäistä käsittelyä.

*Riippumatta siitä, voitko kasvattaa palvelimen ruuhkaa, tarvitset asiakaskoodissasi retry -logiikkaa selviytyäksesi tästä ongelmasta, sillä vaikka ruuhka olisi pitkä, palvelin saattaa vastaanottaa paljon muita pyyntöjä kyseiseen porttiin kyseisenä ajankohtana.

On olemassa harvinainen mahdollisuus, että NAT-reititin antaisi tämän virheen, jos sen porttien yhdistämismahdollisuudet ovat loppuneet. Luulen kuitenkin, että tämä mahdollisuus on liian epätodennäköinen, koska reitittimellä on 64 000 samanaikaista yhteyttä samaan kohdeosoitteeseen/porttiin ennen kuin se loppuu.

Kommentit (12)

Mahdollisin syy on palomuuri.

Tämä artikkeli sisältää joukon syitä. Siitä voi olla sinulle hyötyä.

Artikkelin perusteella mahdollisia syitä voisivat olla:

  • FTP-palvelimen asetukset
  • Ohjelmiston/henkilökohtaisen palomuurin asetukset
  • Useita ohjelmistoja/henkilökohtaisia palomuureja
  • Virustorjuntaohjelmisto
  • LSP-kerros
  • Reitittimen laiteohjelmisto
  • Tietokone sammutettu
  • Tietokone ei ole kytketty
Kommentit (4)

Tämä tapahtui minullekin... Joskus kun avaan projektini, tämä virhe näkyy, mikä oli turhauttavaa. Ongelmana oli, että joskus verkkopalvelun porttinumero muuttui odottamatta.

Tämä ongelma ilmenee yleensä silloin, kun projektista on useampi kuin yksi kopio.

Projektini kutsui verkkopalvelua tietyllä porttinumerolla, jonka määrittelin pääprojektitiedoston Web.Config-tiedostossa. Koska porttinumero muuttui odottamatta, selain ei löytänyt verkkopalvelua ja heitti tämän virheen.

Ratkaisin tämän noudattamalla seuraavia ohjeita: (Visual Studio 2010)

Siirry Web service -projektin ominaisuuksiin --> napsauta Web-välilehteä --> kohdassa Servers --> Tarkista Specific port. ja määritä sitten standardi porttinumero, jolla pääprojektisi kutsuu verkkopalvelua.

Toivottavasti tämä ratkaisee ongelman.

Kippis :)

Kommentit (1)