Soms krijg ik de volgende foutmelding terwijl ik HttpWebRequest deed naar een WebService. Ik heb mijn code hieronder ook gekopieerd.
System.Net.WebException: Kan geen verbinding maken met de externe server ---> System.Net.Sockets.SocketException: Er kon geen verbinding worden gemaakt omdat de doelmachine het actief weigerde 127.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) --- Einde van innerlijke uitzondering stack trace --- 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();
Als dit altijd gebeurt, betekent dit letterlijk dat de machine bestaat maar dat er geen diensten luisteren op de opgegeven poort, of dat er een firewall is die dit tegenhoudt.
Als het af en toe gebeurt - je gebruikte het woord "sometimes" - en het opnieuw proberen lukt, dan is het waarschijnlijk omdat de server een volle 'backlog' heeft.
Wanneer je wacht om geaccepteerd
te worden op een luisterende socket, word je in een backlog geplaatst. Deze backlog is eindig en vrij kort - waarden van 1, 2 of 3 zijn niet ongebruikelijk - en dus is het OS misschien niet in staat om uw verzoek in een wachtrij te plaatsen voor de 'accept' om te consumeren.
De backlog is een parameter op de listen
functie - alle talen en platformen hebben in principe dezelfde API in dit opzicht, zelfs de C# een. Deze parameter is vaak configureerbaar als je de server controleert, en wordt waarschijnlijk gelezen uit een of ander instellingen bestand of het register. Onderzoek hoe u uw server kunt configureren.
Als je de server hebt geschreven, heb je misschien zware verwerking in de accept van je socket, en dit kan beter verplaatst worden naar een aparte worker-thread, zodat je accept altijd klaar is om verbindingen te ontvangen. Er zijn verschillende architectuurkeuzes die je kunt onderzoeken die het in een wachtrij plaatsen van clients en het sequentieel verwerken ervan beperken.
Ongeacht of je de server backlog kunt vergroten, je hebt retry logica nodig in je client code om met dit probleem om te gaan - omdat zelfs met een lange backlog de server op dat moment veel andere aanvragen op die poort zou kunnen ontvangen.
Er is een zeldzame mogelijkheid dat een NAT router deze fout zou geven als zijn poorten voor mappings uitgeput zouden zijn. Ik denk dat we deze mogelijkheid echter als te ver van ons af kunnen schuiven, aangezien de router 64K gelijktijdige verbindingen naar hetzelfde bestemmingsadres/-poort heeft voordat ze uitgeput raken.
De meest mogelijke reden is een Firewall.
Dit artikel bevat een reeks redenen. Het kan nuttig voor u zijn.
Uit het artikel kunnen mogelijke redenen zijn:
Dit is mij ook overkomen... Soms als ik mijn project open kwam deze foutmelding wat frustrerend was. Het probleem was dat soms het poortnummer van de web service onverwacht veranderde.
Dit probleem treedt meestal op als je meer dan een kopie van het project hebt
Mijn project riep de webservice aan met een specifiek poortnummer dat ik had toegewezen in het bestand Web.Config van mijn hoofdprojectbestand. Omdat het poortnummer onverwacht veranderde, kon de browser de webservice niet vinden en gaf deze foutmelding.
Ik heb dit opgelost door de onderstaande stappen te volgen: (Visual Studio 2010)
Ga naar Eigenschappen van het
Web service
project --> klik op Web tab --> In Servers sectie --> Vink Specifieke poort en wijs vervolgens hetstandaard poortnummer
toe waarmee uw hoofdproject de webservice aanroept.
Ik hoop dat dit het probleem oplost.
Proost :)