2013-08-28 20 views
8

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.

risposta

6

Il problema di fondo è che la risposta PATCH include il contenuto all'interno del corpo della risposta. Assicurarsi che il server non invii contenuto quando si invia un 204 No Content.

+0

Grazie! Sto accettando questa risposta perché, anche se la mia fermerà l'errore di essere lanciato, questo garantisce che non ho errori da buttare. –

+1

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. –

9

Dopo molte operazioni di debug e lettura, mi sono reso conto che stavo cercando di modificare il file Web.Config dell'applicazione WPF invece del file app.config!

Quindi, se si rilascia questo codice nel file app.config nella radice del tag di configurazione per un'applicazione WPF, il problema viene risolto.

<system.net> 
<settings> 
<httpWebRequest useUnsafeHeaderParsing = "true"/> 
</settings> 
</system.net> 
Problemi correlati