Napisałem usługę WCF z .NET 4.0, która jest hostowana na moim systemie Windows 7 x64
Ultimate z IIS 7.5. Jedna z metod usługi ma „obiekt” jako argument i próbuję wysłać bajt [], który zawiera obraz. O ile rozmiar pliku tego obrazu jest mniejszy niż ok. 48 KB, wszystko idzie dobrze. Ale jeśli próbuję przesłać większy obraz, usługa WCF zwraca błąd: (413) Request Entity Too Large.
Oczywiście spędziłem 3 godziny na wyszukiwaniu w Google komunikatu o błędzie, a każdy temat, który widziałem na ten temat, sugeruje podniesienie właściwości „uploadReadAheadSize”. Więc to, co zrobiłem, to użycie następujących poleceń (10485760 = 10 MB):
"appcmd.exe set config -section:system.webserver/serverruntime/uploadreadaheadsize: 10485760 /commit:apphost"
"cscript adsutil.vbs set w3svc/<APP_ID>/uploadreadaheadsize 10485760"
Użyłem również Menedżera IIS do ustawienia wartości, otwierając witrynę i przechodząc do „Edytora konfiguracji” w sekcji Zarządzanie. Niestety nadal otrzymuję błąd Zbyt duża jednostka żądania i robi się to naprawdę frustrujące!
Więc czy ktoś wie, co jeszcze mogę spróbować naprawić ten błąd?
Odpowiedzi:
To nie jest problem IIS, ale problem WCF. Usługa WCF domyślnie ogranicza komunikaty do 65 KB, aby uniknąć ataku typu „odmowa usługi” z dużymi komunikatami. Również jeśli nie używasz MTOM, wysyła bajt [] do łańcucha zakodowanego algorytmem base64 (wzrost rozmiaru o 33%) => 48KB * 1,33 = 64KB
Aby rozwiązać ten problem, musisz ponownie skonfigurować usługę, aby akceptowała większe wiadomości. Ten problem wcześniej wywołał błąd nieprawidłowego żądania 400, ale w nowszej wersji WCF zaczął używać 413, który jest poprawnym kodem stanu dla tego typu błędu.
Musisz ustawić
maxReceivedMessageSize
swoje wiązanie. Możesz także ustawićreaderQuotas
.źródło
Miałem ten sam problem z usługami IIS 7.5 z usługą WCF REST. Próba przesłania przez POST dowolnego pliku powyżej 65 KB i zwróci błąd 413 „Żądanie jednostki jest zbyt duże”.
Pierwszą rzeczą, którą musisz zrozumieć, jest rodzaj wiązania skonfigurowanego w pliku web.config. Oto świetny artykuł ...
BasicHttpBinding vs WsHttpBinding vs WebHttpBinding
Jeśli masz usługę REST, musisz skonfigurować ją jako „webHttpBinding”. Oto poprawka:
źródło
Miałem ten sam problem i ustawiając
uploadReadAheadSize
go rozwiązałem:http://www.iis.net/configreference/system.webserver/serverruntime
„Wartość musi zawierać się w przedziale od 0 do 2147483647.”
Można to łatwo ustawić w pliku applicationHost.config-fle, jeśli nie chcesz wykonywać czynności cmd.
Znajduje się na
WindowsFOLDER\System32\inetsrv\config
(serwer 2008).Musisz go otworzyć za pomocą notatnika. Najpierw wykonaj kopię zapasową pliku.
Zgodnie z komentarzami w config, zalecanym sposobem odblokowania sekcji jest użycie tagu lokalizacji:
Możesz więc pisać na dole (ponieważ wcześniej tego nie było). Piszę
maxvalue
tutaj - napisz swoją wartość, jeśli chcesz.Jeśli
</configuration>
na przykład umieścisz go na końcu , wiesz, gdzie go masz.Mam nadzieję, że to rozwiązuje twoje problemy. Był to dla mnie problem z narzutem SSL, gdzie zbyt duża liczba postów zawieszała aplikację, powodując błąd (413) Request Entity Too Large .
źródło
maxReceivedMessageSize
int.MaxValue, to załatwiło sprawę. Zastanawiam się, czy są jakieś poważne problemy z ustawieniem tej opcji również na int.MaxValue?Otrzymałem ten komunikat o błędzie, mimo że
max
ustawienia zostały ustawione w ramach powiązania mojego pliku konfiguracyjnego usługi WCF:Wyglądało na to, że te ustawienia powiązań nie zostały zastosowane, dlatego pojawił się następujący komunikat o błędzie:
.
Problem
Zdałem sobie sprawę, że
name=""
atrybut w<service>
tagu zweb.config
to nie darmowy pole tekstowe, jak myślałem, że to. Jest to w pełni kwalifikowana nazwa realizacji umowy serwisowej, jak wspomniano na tej stronie dokumentacji .Jeśli to nie pasuje, ustawienia powiązania nie zostaną zastosowane!
Mam nadzieję, że to komuś oszczędza trochę bólu ...
źródło
Jeśli napotykasz ten problem pomimo wypróbowania wszystkich rozwiązań w tym wątku i łączysz się z usługą przez SSL (np. Https), może to pomóc:
http://forums.newatlanta.com/messages.cfm?threadid=554611A2-E03F-43DB-92F996F4B6222BC0&#top
Podsumowując (w przypadku, gdy łącze znika w przyszłości), jeśli Twoje żądania są wystarczająco duże, negocjacja certyfikatu między klientem a usługą zakończy się losowo. Aby temu zapobiec, musisz włączyć określone ustawienie w powiązaniach SSL. Oto kroki, które musisz wykonać na serwerze IIS:
netsh http show sslcert
. Dzięki temu uzyskasz aktualną konfigurację. Będziesz chciał to jakoś zapisać, aby móc później odwołać się do niego.netsh http delete sslcert <ipaddress>:<port>
gdzie<ipaddress>:<port>
jest IP: port pokazany w zapisanej wcześniej konfiguracji.netsh http add sslcert
tutaj (MSDN), ale w większości przypadków polecenie będzie wyglądać następująco:netsh http add sslcert ipport=<ipaddress>:<port> appid=<application ID from saved config including the {}> certhash=<certificate hash from saved config> certstorename=<certificate store name from saved config> clientcertnegotiation=enable
Jeśli masz wiele powiązań SSL, powtórz proces dla każdego z nich. Mam nadzieję, że pomoże to komuś zaoszczędzić wiele godzin bólu głowy, który spowodował ten problem.
EDYCJA: Z mojego doświadczenia wynika, że nie można w rzeczywistości uruchomić
netsh http add sslcert
polecenia bezpośrednio z wiersza poleceń. Najpierw musisz wpisać znak zachęty netsh, wpisując,netsh
a następnie wydając poleceniehttp add sslcert ipport=...
, aby zadziałało.źródło
To pomogło mi rozwiązać problem (jedna linia - podzielona ze względu na czytelność / możliwość kopiowania):
źródło
Dla mnie ustawienie
uploadReadAheadSize
int.MaxValue również rozwiązało problem, po zwiększeniu limitów powiązania WCF.Wygląda na to, że przy korzystaniu z SSL cała treść jednostki żądania jest wstępnie ładowana, dla której ta właściwość metabazy jest używana.
Aby uzyskać więcej informacji, zobacz:
Strona nie została wyświetlona, ponieważ jednostka żądania jest za duża. iis7
źródło
Dla każdego, kto kiedykolwiek szukał błędu 413 programu IIS WCF: Zażądaj jednostki do dużej i korzystającej z usługi WCF w programie Sharepoint, to są informacje dla Ciebie. Ustawienia w hoście aplikacji i web.config sugerowane w innych witrynach / postach nie działają w programie SharePoint, jeśli używasz właściwości MultipleBaseAddressBasicHttpBindingServiceHostFactory. Możesz użyć SP Powershell, aby uzyskać usługę SPWebService.Content, utworzyć nowy obiekt SPWcvSettings i zaktualizować ustawienia jak wyżej dla swojej usługi (nie będą istnieć). Pamiętaj, aby podczas tworzenia i dodawania ustawień używać tylko nazwy usługi (np. [Yourservice.svc]). Zobacz tę witrynę, aby uzyskać więcej informacji https://robertsep.wordpress.com/2010/12/21/set-maximum-upload-filesize-sharepoint-wcf-service
źródło
W moim przypadku musiałem zwiększyć „Maksymalny rozmiar odebranej wiadomości” w lokalizacji odbioru w BizTalk. Ma to również domyślną wartość 64 KB, więc każda wiadomość została odesłana przez BizTAlk niezależnie od tego, co skonfigurowałem w moim web.config
źródło
Udało mi się to rozwiązać, wykonując fikcyjne wywołanie (np. IsAlive zwracające true) tuż przed żądaniem z dużą zawartością na tym samym kanale / kliencie WCF. Najwyraźniej negocjacja SSL odbywa się przy pierwszym wywołaniu. Więc nie ma potrzeby zwiększania Uploadreadaheadsize.
źródło
w przypadku problemu serwer zdalny zwrócił nieoczekiwaną odpowiedź: (413) żądanie jednostki zbyt dużej na WCF z Resful
zobacz moją konfigurację wyjaśniającą
źródło
W moim przypadku otrzymywałem ten komunikat o błędzie, ponieważ zmieniono przestrzeń nazw usługi, a tag usług został wskazany na starszą przestrzeń nazw. Odświeżyłem przestrzeń nazw i błąd zniknął:
źródło
Wystąpił podobny błąd w usługach IIS Express z programem Visual Studio 2017.
Rozwiąż ten problem, edytując
\.vs\config\applicationhost.config
. Przełącz sięserverRuntime
zDeny
na wAllow
ten sposób:Jeśli ta wartość nie jest edytowana, podczas ustawiania pojawi się taki błąd
uploadReadAheadSize
:Następnie edytuj,
Web.config
używając następujących wartości:źródło