Foutafhandeling (RPC)
In synchrone RPC voert een client een externe aanroep uit die wordt geretourneerd met een geslaagde of foutcode. Asynchrone RPC biedt meer mogelijkheden voor een aanroep die mislukt en deze fouten worden anders afgehandeld, afhankelijk van waar en wanneer ze plaatsvinden. In de volgende tabel worden de manieren beschreven waarop een aanroep kan mislukken en hoe deze wordt verwerkt.
Opschonen aan clientzijde
Foutsymptoom | Opruimen |
---|---|
Client onderschept een uitzondering wanneer deze de externe procedure aanroept. | Er zijn geen RPC API-aanroepen nodig. Alle RPC-status is opgeschoond. |
Client ontvangt een melding dat het gesprek is voltooid, maar wanneer deze RpcAsyncCompleteCallaanroept, ontvangt deze een foutcode. | Er zijn geen RPC API-aanroepen nodig. Alle RPC-status is opgeschoond. |
Clientproblemen met niet-afgebroken of afgebroken annuleren. | Client moet wachten op melding en RpcAsyncCompleteCall aanroepen wanneer de melding binnenkomt. |
Bij het opschonen aan de serverzijde is een belangrijk concept het hand-off-punt. Tijdens de verwerking aan de serverzijde van een asynchrone aanroep wordt meestal een bepaalde verwerking uitgevoerd op de thread die de aanroep heeft ontvangen (ook wel bekend als de dispatcherthread), en vervolgens plaatst de dispatcherthread voldoende status in een geheugenblok en wordt een andere thread (ook wel bekend als werkrolthread) om door te gaan met de verwerking van het gesprek. Het moment waarop de dispatcherthread met succes aangeeft dat de werkrolthread het hand-off puntwordt genoemd.
Opschonen aan serverzijde
Er is een fout opgetreden | Opruimen |
---|---|
Voor het hand-off punt. | Een uitzondering genereren. Er is geen aanroep naar RpcAsyncCompleteCall- nodig. |
Na het afleverpunt. | Aanroepen RpcAsyncAbortCall of, als de fout niet onherstelbaar is en de resultaten nog steeds naar de client kunnen worden geretourneerd, RpcAsyncCompleteCall. Als de RpcAsyncCompleteCall functieaanroep mislukt, worden de parameters door de RPC-runtime vrijgemaakt. De gebruiker mag geen toegang krijgen tot deze parameters. De dispatcherthread mag geen aanzienlijke verwerking uitvoeren die kan mislukken na het hand-off-punt, omdat de oproep niet meer veilig kan worden afgebroken. In het bijzonder mag er geen uitzondering worden gegenereerd na het hand-off-punt of kan de server vastlopen. |
Speciale foutafhandelingscases voor pipes
Er zijn speciale gevallen voor foutafhandeling bij het gebruik van pijpen. In de volgende lijst wordt de bron van de fout uitgelegd en hoe u de fout kunt afhandelen.
Bron van fout | Hoe afgehandeld |
---|---|
Clientoproepen pushen en de aanroep mislukt. | Er zijn geen RPC API-aanroepen nodig. Alle RPC-status is opgeschoond. |
Clientaanroepen RpcAsyncCompleteCall- voordat de in pijpen worden leeggezogen. | De aanroep mislukt met de juiste foutcode voor het doorvoeren van pijpen. |
Clientoproepen worden opgehaald en de aanroep mislukt. | Er zijn geen RPC API-aanroepen nodig. Alle RPC-status is opgeschoond. |
Client- of serveroproepen pushen of pullen in de verkeerde volgorde. | Runtime retourneert de foutstatus van pijpvullen. |
Serveroproepen pushen of pullen en de aanroep mislukt. | Push retourneert een foutcode. Er is geen aanroep naar RpcAsyncCompleteCall- nodig. |
Server roept RpcAsyncCompleteCall- aan voordat de pijpen zijn leeggemaakt. | De pipe-aanroep retourneert de foutstatus van een pijpvulling. |
Na de verzending mislukt een ontvangstbewerking. | De volgende keer dat de server aanroept om pijpgegevens te ontvangen, wordt er een fout geretourneerd. |