Sto utilizzando la classe HttpClient per comunicare con un servizio Web nella mia applicazione WPF.C#: HttpClient, il server ha commesso una violazione del protocollo. Section = ResponseStatusLine
Quando si effettuano richieste GET consecutive sulla stessa connessione, tutto funziona correttamente. Tuttavia, quando faccio richieste PUT/PATCH consecutive sulla stessa connessione, la prima richiesta viene eseguita con precisione e ricevo una risposta, ma la seconda richiesta non include il corpo nella richiesta e ricevo l'infame errore di "Il server ha commesso un protocollo violazione. Sezione = ResponseStatusLine ".
Le mie richieste vengono completate correttamente se chiudo manualmente la connessione dopo ogni richiesta aggiungendo Connessione: chiudi nell'intestazione. Questa "soluzione" è un cattivo schema e le prestazioni non verranno ridimensionate in modo appropriato.
Qui di seguito è una versione debranded di un elenco di mia uscita TCP flusso dalle richieste vengono inviati:
Wireshark: Seguire TCP flusso di output
GET /domain/api/tenant/current/object?objectName=Lizbot HTTP/1.1
Accept: application/json
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 50
{"Data":[{"Id":123,"ObjectName":"Lizbot","Date":null}],"Errors":[]}
PATCH /domain/api/tenant/current/object/123 HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
Content-Length: 50
{"Id":123,"ObjectName":"Lizbot","Date":null}
HTTP/1.1 204 No Content
Content-Type: application/json; charset=utf-8
{"Data":null,"Errors":[]}
PATCH /domain/api/tenant/current/object/123/otherObject HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
HTTP/1.1 400 Bad Request</b>
Content-Type: text/html; charset=us-ascii
Connection: close
Content-Length: 311
noti che la seconda patch manca la oggetto con cui dovrebbe essere applicato. Se cambio l'ordine del PATCHing, al secondo PATCH manca ancora il suo oggetto.
Questo errore sembra essere comune con alcune soluzioni note che ho provato. Sono costituiti da this solution che comporta l'impostazione della proprietà useUnsafeHeaderParsing su TRUE e l'impostazione della proprietà Keep-Alive su FALSE in Web.Config. Ho anche provato la soluzione di impostare queste proprietà in questo modo:
ServicePointManager.DefaultConnectionLimit = 2;
ServicePointManager.Expect100Continue = false;
Nessuna di queste soluzioni ha funzionato. Va notato che quando si utilizza lo strumento proxy Http Debugging, Fiddler, per acquisire queste richieste, non ricevo errori.
Quindi quello che sto chiedendo è se qualcuno conosce una buona soluzione per alleviare questo errore in modo da poter fare più richieste in una connessione senza perdere il corpo di un aggiornamento. Se sono necessari ulteriori dettagli, sono lieto di fornirli.
Grazie! Sto accettando questa risposta perché, anche se la mia fermerà l'errore di essere lanciato, questo garantisce che non ho errori da buttare. –
Anche se sono d'accordo sul fatto che inviare 204 con un corpo è una violazione del protocollo, HttpClient può gestire questa situazione senza alcun problema. Come può l'API web self-hosted. Forse IIS incasina le cose. –