2013-03-08 13 views
5

Mam następujący problem.Uzyskiwanie błędów 413 w usługach IIS z równoczesnymi sesjami przy użyciu tego samego certyfikatu klienta HTTPS

Jestem gospodarzem aplikacji WCF na serwerze IIS 8, która akceptuje tylko żądania HTTPS z certyfikatami klienta w postaci tylko. Ta usługa akceptuje komunikaty POST, które mogą mieć różny rozmiar (od kilku bajtów do 1 GB) i są odbierane równolegle przez większość czasu.

Klienci są coraz podmiotu 413 zażądać zbyt dużą odpowiedź w następującym przypadku:

  • Przy wielu połączeń są otwarte z samego certyfikatu na klienta i wiele małych plików są przesyłane. W takim przypadku jedno żądanie zakończy się sukcesem, a wszystkie inne zawiodą z błędem 413.

Problem ten może być rozwiązany przez ustawienie wartości do większej wartości niż suma wszystkich równoległych rozmiarów połączeń w przekroju system.webServer/serverRuntime konfiguracji uploadReadAheadSize, ale powoduje, że serwer przydzielić całą ilość pamięci dla bufor do odczytu dla każdego wywołania, który powoduje, że serwerowi brakuje pamięci w przypadku wielu jednoczesnych wywołań.

Moja konfiguracja działa czy połączenia są wykonane z różnych certyfikatów klienta lub w przypadku przesyłania jednego dużego pliku.

Przeczytałem, że z IIS 6 była opcja ustawienia SSLAlwaysNegoClientCert w konfiguracji, aby naprawić podobny błąd. Próbowałem ustawić workarounds, aby ustawić tę wartość, ale nie udało się użyć IIS 8.0. Próbowałem również wyłączyć pamięć podręczną klienta SSL, aby wyłączyć wznawianie sesji SSL, ale to też nie rozwiązało mojego problemu.

Co może powodować błędy 413? Czy istnieje sposób, aby włączyć wiele równoległych przesyłanie z certyfikatu klienta do tego samego serwera bez korzystania z całej pamięci serwera.

+1

Czy próbowałeś jakiegoś podejścia do wewnętrznego dzielenia wiadomości na mniejsze rozmiary? –

+1

To jest usługa przesyłania strumieniowego z interfejsem API REST. Tak samo będzie w przypadku przesyłania z tymi samymi certyfikatami klienta z wielu lokalizacji. – hpityu

+1

Czy możesz dołączyć swoją umowę serwisową? Zakładam, że albo nie używasz strumienia, albo używasz 'TransferMode = Buffered' – Aron

Odpowiedz

1

tylko domyślać:

Jeśli renegocjacja klient jest proszony, ciało podmiot Wniosek musi być fabrycznie za pomocą napięcia wstępnego SSL. Wstępne ładowanie SSL będzie korzystać z wartości właściwości metabazy UploadReadAheadSize, która jest używana dla rozszerzeń ISAPI. Jednak jeśli rozmiar UploadReadAheadSize jest mniejszy niż długość zawartości, zwracany jest błąd HTTP 413, a połączenie jest zamykane, aby zapobiec zakleszczeniu. (Zakleszczenie występuje, ponieważ klient oczekuje na zakończenie wysyłania jednostki żądania, podczas gdy serwer czeka na zakończenie renegocjacji, ale renegocjacja wymaga, aby klient mógł wysyłać dane, których nie może wykonać).

(Z artykułu Client cannot renegotiate request and returns an HTTP 413 error (IIS 6.0).)

renegocjacja Klient występuje, gdy SSLAlwaysNegoClientCert nie jest ustawiona, więc używać OpenSSL, by sprawdzić, czy jest ona włączona (patrz this question). Nie korzystałem z IIS 8, ale w IIS 7.5 działają dla mnie obie możliwości włączenia SSLAlwaysNegoClientCert z the question you linked.

+0

Czy jest to powiązane z IIS 7 lub 8? – mtkachenko

Powiązane problemy