Zahteva ne uspe z GatewayRequestException
Okolje
Vsaka različica odjemalca s podatkovnim prehodom Wkl.Data.Gateway.
Vzrok
Vsak vir napake – odgovor prehoda, prekoračitev časovne omejitve, prekinjena povezava, neberljiv odgovor –
prispe kot GatewayRequestException z GatewayProblem: Kind (vrsta), Message (besedilo prehoda
ali odjemalca), CorrelationId (identifikator, pod katerim prehod zapiše podrobnosti v dnevnik) in
IsTransient (true samo pri Unavailable in TimedOut).
Prehod v odgovoru navede kodo, odjemalec pa iz nje prevzame vrsto. Če kode ni – na primer ker je
namesto prehoda odgovoril posredniški strežnik ali izenačevalnik obremenitve –, odjemalec napako razvrsti po
statusu HTTP: 400 → MalformedRequest, 401 → Unauthenticated, 403 → Forbidden, 404 →
UnknownResource, 409 → Conflict, 412 → PreconditionFailed, 413, 414 in 429 →
LimitExceeded, 422 → DatabaseRejected, 504 → TimedOut, vsak drug status → Unavailable.
Svoje napake prehod javlja s temi kodami; 500 izvira iz člena med odjemalcem in prehodom ali iz
nepričakovane napake, ki je prehod ni mogel prestreči.
Dve napaki ne prispeta kot GatewayRequestException:
ArgumentExceptionpri ustvarjanjuGatewayResource,GatewayQuery,GatewayFilteraliGatewayRoutineRequestter priReadAsyncza ime argumenta: ime ni veljaven identifikator ali vrednost je zunaj dovoljenega obsega (glejte Programski vmesnik). Zahteva ni bila poslana.JsonExceptionpri branju vrstic: odgovor se ne ujema sTRow, na primer ker stolpec vrne besedilo, lastnost pa pričakuje število. Zahteva se je izvedla; popravite tip vrstice ali berite vJsonElement.
Rešitev
Kind | Pomen | Kaj storiti |
|---|---|---|
Unauthenticated | ključ ni nastavljen; ključ je neveljaven, preklican ali potekel; ali pravilo prijave zahteva 2FA | Preverite spremenljivko okolja iz ApiKeyEnvironmentVariable (prebere se ob vsaki zahtevi; če manjka, se zahteva ne pošlje). Če pravilo zahteva 2FA, odjemalec ključa ne more uporabiti; skrbnika prosite za ključ brez te zahteve |
Forbidden | pravilo ključa dostopa ne dovoli | Naj skrbnik prehoda preveri pravilo; navedite CorrelationId |
UnknownResource | alias ali objekt ne obstaja ali ni odobren – namerno nerazločljivo. Neznano polje pa prispe kot MalformedRequest | Preverite zapis; nato ravnajte kot pri Forbidden |
UnknownResource samo pri dolgih bralnih zahtevah | starejši prehod ne sprejema bralnih zahtev v telesu (POST …/$query) | Povečajte MaxUrlLength ali posodobite prehod |
MalformedRequest | zahteva je neveljavna, na primer neznano polje, vrednost tipa, ki je ni mogoče prenesti, ali argumenti za objekt, ki jih ne sprejema | Preverite imena polj, filtre in vrednosti |
LimitExceeded | preveč zahtev (429), prevelika zahteva (413, 414) ali odgovor, večji od MaxResponseBytes, katerega dolžino je prehod navedel vnaprej | Pri 429 poskusite pozneje; sicer zmanjšajte okno ali izbiro polj ali povečajte MaxResponseBytes |
DatabaseRejected | podatkovna zbirka ali procedura je zahtevo zavrnila | Če je procedura sprožila sporočilo (THROW ali RAISERROR s številko od 50000 naprej in resnostjo od 11 do 16), je njegovo besedilo v Message; sicer je tam nespremenljivo besedilo, razlog pa navaja EngineMessages (glejte spodaj) |
Conflict | stavek krši ključ ali enolični indeks, tudi v proceduri (od odjemalca 0.2.1) | Ne ponavljajte: ista zahteva spet ne uspe. Preverite vrednosti; EngineMessages navede sporočilo |
PreconditionFailed | vrstica je bila po branju spremenjena (od odjemalca 0.2.1) | Vrstico znova preberite in spremembo ponovite na novem stanju |
TimedOut | prehod je stavek prekinil po svoji časovni omejitvi | Branje: zožite zahtevo ali poskusite pozneje. Klicanje: ne ponavljajte na slepo – najprej preverite, ali je procedura učinkovala |
Unavailable | prehod ali podatkovna zbirka ni dosegljiva, povezava se je prekinila, odgovor ni berljiv ali je odjemalec obupal po svoji časovni omejitvi | Branje: poskusite pozneje; če stanje ostane, obvestite skrbnika. Klicanje: ne ponavljajte na slepo – če je bila zahteva poslana, je procedura morda učinkovala |
DatabaseUnreadable | SQL Server odgovarja, vendar podatkovne zbirke aliasa ne more prebrati (od odjemalca 0.2.0) | Ne ponavljajte (IsTransient je false): stanje ostane, dokler skrbnik ne odpravi vzroka, navadno s ponovnim zagonom SQL Serverja; obvestite skrbnika s CorrelationId |
IsTransient pove samo, ali bi ista zahteva pozneje lahko uspela. Ne pove pa, ali je ponovitev
neškodljiva: pri klicu procedure o tem odloči aplikacija.
Ob vsakem vprašanju skrbniku navedite CorrelationId, čas, alias in objekt.
DatabaseUnreadable ne zajema vsake neberljive podatkovne zbirke. Prehod javi DatabaseUnreadable
samo za določen seznam številk napak SQL Serverja; napaka pri branju iz drugega razloga še vedno prispe kot
Unavailable. Odsotnost te vrste torej ne dokazuje, da je podatkovna zbirka berljiva. Seznam je v
„HTTP: specifikacija vmesnika“ (dokumentacija podatkovnega prehoda), razdelek „Oblika napak“.
Sporočila SQL Serverja (od odjemalca 0.2.0). Problem.EngineMessages za vsako sporočilo vsebuje
Number, SqlState, Severity, Message in Released. Če je Released false, je v Message
besedilo prehoda namesto besedila SQL Serverja, ker bi to navajalo imena objektov, ki jih klicatelj ne
sme videti, ali – pri prijavi aliasa – lahko navedlo vrednost podatka; številka in SQLSTATE prispeta
vedno. Prehod pred specifikacijo vmesnika 0.5.0 sporočil ne pošilja; seznam je tedaj prazen. Pri prekinjeni
povezavi in prekoračitvi časovne omejitve je vedno prazen.