2013-03-08 14 views
5

Ho il seguente problema.Ottenere 413 errori su IIS con sessioni simultanee che utilizzano lo stesso certificato client HTTPS

Sto ospitando un'applicazione WCF su IIS 8 che accetta solo richieste HTTPS con certificati client. Questo servizio accetta messaggi POST che possono variare di dimensioni (da pochi byte fino a 1 GB) e vengono ricevuti in parallelo per la maggior parte del tempo.

I clienti stanno ottenendo un 413 Richiesta un'entità troppo grande risposta nel seguente caso:

  • Quando più connessioni vengono aperte con lo stesso certificato client e molti piccoli file vengono caricati. In questo caso, una richiesta ha esito positivo e tutte le altre falliscono con errore 413.

Il problema potrebbe essere risolto impostando il valore uploadReadAheadSize ad un valore maggiore della somma di tutti i formati di chiamata parallele nella sezione system.webServer/serverRuntime della configurazione, ma questo causa il server per allocare l'intera quantità di memoria per il buffer di lettura anticipata per ogni chiamata che fa sì che il server esaurisca la memoria in caso di molte chiamate contemporanee.

La mia configurazione lavora se le chiamate sono fatte con diversi certificati client o in caso di caricamento di un unico grande file.

Ho letto che con IIS 6 c'era un'opzione per impostare SSLAlwaysNegoClientCert nella configurazione per correggere un bug simile. Ho provato workarounds per impostare questo valore, ma non ci sono riuscito usando IIS 8.0. Ho anche provato a disattivare la cache del client SSL per disabilitare la ripresa della sessione SSL, ma questo non ha risolto il mio problema.

Che cosa può causare gli errori 413? Esiste un modo per abilitare più caricamenti paralleli con un certificato client sullo stesso server senza utilizzare l'intera memoria del server.

+1

Hai provato un approccio per dividere internamente i messaggi a dimensioni più ridotte? –

+1

Questo è un servizio di upload in streaming con un'API REST. Ma lo stesso accadrebbe in quel caso di caricamento con gli stessi certificati client da più posizioni. – hpityu

+1

È possibile includere il contratto di servizio. Suppongo che tu stia o non stai usando un flusso o stai usando 'TransferMode = Buffered' – Aron

risposta

1

Solo una supposizione:

Se rinegoziazione cliente viene richiesto, il corpo dell'entità richiesta deve essere precaricato con precarico SSL. Il precarico SSL utilizzerà il valore della proprietà della metabase UploadReadAheadSize, che viene utilizzata per le estensioni ISAPI. Tuttavia, se UploadReadAheadSize è inferiore alla lunghezza del contenuto, viene restituito un errore HTTP 413 e la connessione viene chiusa per impedire il deadlock. (Il deadlock si verifica perché un client è in attesa di completare l'invio di un'entità di richiesta, mentre il server è in attesa del completamento della rinegoziazione, ma la rinegoziazione richiede che il client sia in grado di inviare dati, cosa che non può fare).

(Dall'articolo Client cannot renegotiate request and returns an HTTP 413 error (IIS 6.0).)

rinegoziazione client si verifica quando SSLAlwaysNegoClientCert non è impostato, in modo da utilizzare OpenSSL per verificare se è abilitato (vedi this question). Non ho utilizzato IIS 8, ma su IIS 7.5, entrambi i metodi per abilitare SSLAlwaysNegoClientCert da the question you linked funzionano per me.

+0

E 'collegato a IIS 7 o 8? – mtkachenko

Problemi correlati