Klasse System.NET.HttpWebRequest genereert SSL en niet-SSL-aanvragen onder speciale voorwaarden voor verschillende WebExceptionStatus

Vertaalde artikelen Vertaalde artikelen
Sluiten Sluiten
Artikel ID: 2007873 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Symptomen

U gebruikt de klasse System.Net.HttpWebRequest van de.NET framework HTTP of HTTPS-aanvraag naar een server verzenden. Dit verzoek neemt enige tijd een antwoord ontvangen van de server. Tijdens deze wachttijd treedt als de systeemtijd van de klok handmatig verhoogd of de systeemklok vertraagde achter en vervolgens de Windows Time-service wordt aangepast aan de feitelijke lokale tijd een van de volgende:

-De klasse System.Net.HttpWebRequest voor een aanvraag die is verzonden via HTTP als leesbare tekst, genereert de volgende uitzondering:

De aanvraag is afgebroken: de time-out.

Bovendien geeft de eigenschap Status op thrown WebException de waarde WebExceptionStatus.Timeout.

-Voor een aanvraag die is verzonden via HTTPS, de klasse System.Net.HttpWebRequest genereert een van de volgende uitzonderingen:

De onderliggende verbinding is gesloten: een onverwachte fout opgetreden op een ontvangen.

Bovendien geeft de eigenschap Status op thrown WebException de waarde WebExceptionStatus.ReceiveFailure.

OF

De onderliggende verbinding is gesloten: een verbinding verwacht leven wordt gehouden door de server is afgesloten.

Bovendien geeft de eigenschap Status op thrown WebException de waarde WebExceptionStatus.KeepAliveFailure.

Heeft de eigenschap InnerException in alle bovenstaande scenario's WebException die is gevangen. Als u de WebException catch en verwijst naar de eigenschap WebException.InnerException.InnerException, ziet u dat alle bovenstaande gevallen het bericht wordt aangegeven: 'Een verbindingspoging is mislukt omdat de verbonden partij niet correct heeft geantwoord na een periode of de verbinding is mislukt omdat de verbonden host reageert niet'. Dit bericht is een uitgebreide interpretatie van de Winsock-foutcode 10060 = WSAETIMEDOUT.

Dus wanneer de systeemtijd handmatig wordt verhoogd, winsock correct time-fout 10060 genereert, maar haalt rond gewikkeld als uitzondering voor verschillende typen SSL en niet-SSL-verzoeken.

Onder normale time-out omstandigheden waarin de systeemtijd niet is geknoeid met SSL en niet-SSL-scenario's wordt correct weerspiegelen de status van WebExceptionStatus.Timeout en algemene uitzondering: 'de bewerking is een time-out'.

Oorzaak

Wanneer u de aanvraag via SSL of niet-SSL, kunnen de klasse System.Net.ServicePointManager wordt de aanvraag toewijzen aan een interne verbinding zal uiteindelijk de winsock-verbinding.  Deze aanvraag/verbinding gaat van SSL-verzoeken via een andere interne SSL/TLS-klasse die verantwoordelijk voor de codering/decodering van gegevens is. Voor niet-SSL-verbindingen wordt deze interne SSL/TLS-klasse niet op alle betrokken.

Wanneer de tijd gewijzigd en de uitzondering is opgetreden op de winsock-laag, moet deze fout nu omhoog reizen van winsock op de toepassingslaag. Deze uitzondering gevangen rechtstreeks door de interne verbinding klasse voor niet-SSL-verbindingen, maar SSL-aanvragen voor deze fout wordt afgehandeld door de interne SSL/TLS-klasse. Deze klasse beschouwt deze fout 'niet-SSL' als ReceiveFailure/KeepAliveFailure en dus een andere uitzonderingsstatus heeft, dat voor niet-SSL-verbinding de fout wordt gegoten correct aangezien wordt verwerkt door een andere klasse.

Dit gedrag is inherent.

Oplossing

Voor oplossen van dit verschil thrown uitzondering soorten onder deze speciale voorwaarde die waar de systeemtijd is geknoeid met de toepassing moet de WebException onderscheppen en vervolgens verwijzen naar de eigenschap WebException.InnerException.InnerException.Message.

Als de tekenreeks is gelijk aan de winsock uitgebreide fout equivalent van 10060 = WSAETIMEDOUT, dan u de ReceiveFailure overwegen kunt / KeepAliveFailure als een gewone time-out en niet beschouwen als een ReceiveFailure/KeepAliveFailure.

Kan de toepassing gebruik de onderstaande oplossing bij het uitvoeren van catch() van de WebException voor een Engelse versie van het framework. Merk op dat een gelokaliseerde versie van het kader voor de onder oplossing moet worden aangepast, afhankelijk van de taal te lokaliseren.

Belangrijk: deze voorbeeldcode als-is en is alleen bedoeld voor monster.  Het wordt verstrekt zonder garanties en verleent geen rechten.

{Probeer
........
........
}
catch (WebException oWEx)
{
WebExceptionStatus oStatus = oWEx.Status;
String strTimeoutErrorMessage = "Een verbindingspoging is mislukt omdat de verbonden partij niet correct heeft geantwoord na een periode of de verbinding is mislukt omdat de verbonden host reageert niet";

switch (oStatus)
{
Case WebExceptionStatus.KeepAliveFailure:
Als ((oWEx.InnerException! = null)
& & (oWEx.InnerException.InnerException! = null)
& & oWEx.InnerException.InnerException.Message.ToString().Gelijk aan (strTimeoutErrorMessage, StringComparison.CurrentCultureIgnoreCase))
{
//----------------------------------------------------------------------
/ / Timeout-fout die ten onrechte wordt gegenereerd als een ReceiveFailure voor
/ / SSL-aanvragen onder deze speciale voorwaarde.
//
/ Dit als een time-outfout verwerken
//----------------------------------------------------------------------


} else {
//----------------------------------------------------------------------
/ Dit is echt een KeepAliveFailure.
//----------------------------------------------------------------------
}

einde;
Case WebExceptionStatus.Timeout:
//----------------------------------------------------------------------
/ Dit is een time-out.
//----------------------------------------------------------------------
einde;
Case WebExceptionStatus.ReceiveFailure:

BR > als ((oWEx.InnerException! = null)
& & (oWEx.InnerException.InnerException! = null)
& & oWEx.InnerException.InnerException.Message.ToString().Gelijk aan (strTimeoutErrorMessage, StringComparison.CurrentCultureIgnoreCase))
{
//----------------------------------------------------------------------
/ / Timeout-fout die ten onrechte wordt gegenereerd als een ReceiveFailure voor
/ / SSL-aanvragen onder deze speciale voorwaarde.
//
/ Dit als een time-outfout verwerken
//----------------------------------------------------------------------


} else {
//----------------------------------------------------------------------
/ Dit is echt een ReceiveFailure.
//----------------------------------------------------------------------
}
einde;
Standaard:
Opmerking Dit is een artikel voor snelle publicatie dat rechtstreeks is gemaakt vanuit de ondersteuningsorganisatie van Microsoft. De informatie in dit artikel wordt in de huidige vorm aangeboden in reactie op nieuw geconstateerde problemen. Aangezien artikelen van dit type zeer snel moeten worden gepubliceerd, kan de inhoud typografische fouten bevatten en kan de inhoud zonder voorafgaande kennisgeving worden gewijzigd. Raadpleeg de Gebruiksrechtovereenkomst voor overige aandachtspunten.

Eigenschappen

Artikel ID: 2007873 - Laatste beoordeling: vrijdag 1 april 2011 - Wijziging: 4.0
De informatie in dit artikel is van toepassing op:
  • Microsoft .NET Framework 3.5 Service Pack 1
Trefwoorden: 
kbmt KB2007873 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:2007873

Geef ons feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com