Saya telah menulis layanan WCF dengan .NET 4.0, yang dihosting di sistem Windows 7 x64
Ultimate saya dengan IIS 7.5. Salah satu metode layanan memiliki 'objek' sebagai argumen dan saya mencoba mengirim byte [] yang berisi gambar. Selama ukuran file gambar ini kurang dari kira-kira. 48KB, semuanya berjalan dengan baik. Tetapi jika saya mencoba mengunggah gambar yang lebih besar, layanan WCF mengembalikan kesalahan: (413) Request Entity Too Large.
Jadi tentu saja saya telah menghabiskan 3 jam Googling pesan kesalahan dan setiap topik yang saya lihat tentang subjek ini menyarankan untuk menaikkan properti 'uploadReadAheadSize'. Jadi yang saya lakukan adalah menggunakan perintah berikut (10485760 = 10MB):
"appcmd.exe set config -section:system.webserver/serverruntime/uploadreadaheadsize: 10485760 /commit:apphost"
"cscript adsutil.vbs set w3svc/<APP_ID>/uploadreadaheadsize 10485760"
Saya juga telah menggunakan Manajer IIS untuk menetapkan nilai dengan membuka situs dan membuka "Editor Konfigurasi" di bawah Manajemen. Sayangnya, saya masih mendapatkan kesalahan Entitas Permintaan Terlalu Besar dan ini benar-benar membuat frustrasi!
Jadi apakah ada yang tahu apa lagi yang bisa saya coba untuk memperbaiki kesalahan ini?
Jawaban:
Itu bukan masalah IIS tapi masalah WCF. WCF secara default membatasi pesan hingga 65 KB untuk menghindari serangan penolakan layanan dengan pesan besar. Juga jika Anda tidak menggunakan MTOM, ia mengirimkan byte [] ke string yang dikodekan base64 (peningkatan ukuran 33%) => 48KB * 1,33 = 64KB
Untuk mengatasi masalah ini, Anda harus mengkonfigurasi ulang layanan Anda untuk menerima pesan yang lebih besar. Masalah ini sebelumnya memicu kesalahan 400 Permintaan Buruk tetapi dalam versi yang lebih baru WCF mulai menggunakan 413 yang merupakan kode status yang benar untuk jenis kesalahan ini.
Anda perlu mengatur
maxReceivedMessageSize
penjilidan Anda. Anda juga perlu mengaturreaderQuotas
.<system.serviceModel> <bindings> <basicHttpBinding> <binding maxReceivedMessageSize="10485760"> <readerQuotas ... /> </binding> </basicHttpBinding> </bindings> </system.serviceModel>
sumber
Saya mengalami masalah yang sama dengan IIS 7.5 dengan Layanan REST WCF. Mencoba mengunggah melalui POST file apa pun di atas 65k dan itu akan mengembalikan Kesalahan 413 "Permintaan Entitas terlalu besar".
Hal pertama yang perlu Anda pahami adalah jenis pengikatan yang telah Anda konfigurasikan di web.config. Ini artikel bagus ...
BasicHttpBinding vs WsHttpBinding vs WebHttpBinding
Jika Anda memiliki layanan REST maka Anda perlu mengkonfigurasinya sebagai "webHttpBinding". Berikut perbaikannya:
<system.serviceModel> <bindings> <webHttpBinding> <binding maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed"> </binding> </webHttpBinding> </bindings>
sumber
Saya memiliki masalah yang sama dan mengatur
uploadReadAheadSize
penyelesaiannya:http://www.iis.net/configreference/system.webserver/serverruntime
"Nilainya harus antara 0 dan 2147483647."
Ini dengan mudah diatur di applicationHost.config-fle jika Anda tidak ingin melakukan cmd-thing.
Itu terletak di
WindowsFOLDER\System32\inetsrv\config
(server 2008).Anda harus membukanya dengan notepad. Lakukan backup file terlebih dahulu.
Menurut komentar di konfigurasi, cara yang disarankan untuk membuka kunci bagian adalah dengan menggunakan tag lokasi:
<location path="Default Web Site" overrideMode="Allow"> <system.webServer> <asp /> </system.webServer> </location>"
Jadi Anda bisa menulis di bawah (karena tidak ada sebelumnya). Saya menulis di
maxvalue
sini - tulis nilai Anda sendiri jika Anda mau.<location path="THENAMEOFTHESITEYOUHAVE" overrideMode="Allow"> <system.webServer> <asp /> <serverRuntime uploadReadAheadSize="2147483647" /> </system.webServer> </location>
</configuration>
Misalnya, jika Anda meletakkannya terakhir sebelumnya , Anda tahu di mana Anda memilikinya.Harapan itu menyelesaikan masalah Anda. Itu adalah masalah overhead SSL bagi saya, di mana terlalu banyak posting membekukan aplikasi, menimbulkan kesalahan (413) Permintaan Entitas Terlalu Besar .
sumber
maxReceivedMessageSize
ke int.MaxValue, ini berhasil. Saya ingin tahu apakah ada masalah besar dengan pengaturan opsi ini ke int.MaxValue juga?Saya menerima pesan kesalahan ini, meskipun saya telah
max
menyetel pengaturan dalam pengikatan file konfigurasi layanan WCF saya:<basicHttpBinding> <binding name="NewBinding1" receiveTimeout="01:00:00" sendTimeout="01:00:00" maxBufferSize="2000000000" maxReceivedMessageSize="2000000000"> <readerQuotas maxDepth="2000000000" maxStringContentLength="2000000000" maxArrayLength="2000000000" maxBytesPerRead="2000000000" maxNameTableCharCount="2000000000" /> </binding> </basicHttpBinding>
Sepertinya pengaturan pengikatan ini tidak diterapkan, oleh karena itu muncul pesan kesalahan berikut:
.
Masalah
Saya menyadari bahwa
name=""
atribut dalam<service>
tag dariweb.config
ini tidak kolom teks bebas, seperti yang saya pikir itu. Ini adalah nama yang sepenuhnya memenuhi syarat dari implementasi kontrak layanan seperti yang disebutkan dalam halaman dokumentasi ini .Jika tidak cocok, maka pengaturan penjilidan tidak akan diterapkan!
<services> <!-- The namespace appears in the 'name' attribute --> <service name="Your.Namespace.ConcreteClassName"> <endpoint address="http://localhost/YourService.svc" binding="basicHttpBinding" bindingConfiguration="NewBinding1" contract="Your.Namespace.IConcreteClassName" /> </service> </services>
Saya berharap itu menyelamatkan seseorang dari rasa sakit ...
sumber
Jika Anda mengalami masalah ini meskipun telah mencoba semua solusi di utas ini, dan Anda tersambung ke layanan melalui SSL (mis. Https), ini mungkin membantu:
http://forums.newatlanta.com/messages.cfm?threadid=554611A2-E03F-43DB-92F996F4B6222BC0&#top
Untuk meringkas (jika tautan mati di masa mendatang), jika permintaan Anda cukup besar, negosiasi sertifikat antara klien dan layanan akan gagal secara acak. Untuk mencegah hal ini terjadi, Anda harus mengaktifkan pengaturan tertentu pada pengikatan SSL Anda. Dari server IIS Anda, berikut adalah langkah-langkah yang perlu Anda lakukan:
netsh http show sslcert
. Ini akan memberi Anda konfigurasi Anda saat ini. Anda pasti ingin menyimpannya, jadi Anda bisa mereferensikannya lagi nanti.netsh http delete sslcert <ipaddress>:<port>
mana<ipaddress>:<port>
IP: port ditampilkan dalam konfigurasi yang Anda simpan sebelumnya.netsh http add sslcert
sini (MSDN) tetapi dalam banyak kasus perintah Anda akan terlihat seperti ini: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
Jika Anda memiliki beberapa pengikatan SSL, Anda akan mengulangi proses untuk masing-masing pengikatan. Semoga ini membantu menyelamatkan orang lain berjam-jam sakit kepala karena masalah ini menyebabkan saya.
EDIT: Dalam pengalaman saya, Anda tidak dapat benar-benar menjalankan
netsh http add sslcert
perintah dari baris perintah secara langsung. Anda harus memasukkan prompt netsh terlebih dahulu dengan mengetiknetsh
dan kemudian mengeluarkan perintah Anda sepertihttp add sslcert ipport=...
agar bisa berfungsi.sumber
Ini membantu saya menyelesaikan masalah (satu baris - pisahkan untuk keterbacaan / kemampuan menyalin):
C:\Windows\System32\inetsrv\appcmd set config "YOUR_WEBSITE_NAME" -section:system.webServer/serverRuntime /uploadReadAheadSize:"2147483647" /commit:apphost
sumber
Bagi saya, menyetel
uploadReadAheadSize
ke int.MaxValue juga memperbaiki masalah, setelah juga meningkatkan batas pengikatan WCF.Tampaknya, saat menggunakan SSL, seluruh badan entitas permintaan telah dimuat sebelumnya, di mana properti metabase ini digunakan.
Untuk info lebih lanjut, lihat:
Halaman tidak ditampilkan karena entitas permintaan terlalu besar. iis7
sumber
Untuk orang lain yang pernah mencari kesalahan IIS WCF 413: Minta entitas ke besar dan menggunakan layanan WCF di Sharepoint, ini adalah informasi untuk Anda. Pengaturan di host aplikasi dan web.config yang disarankan di situs / postingan lain tidak berfungsi di SharePoint jika menggunakan MultipleBaseAddressBasicHttpBindingServiceHostFactory. Anda dapat menggunakan SP Powershell untuk mendapatkan layanan SPWebService.Content, membuat objek SPWcvSettings baru dan memperbarui pengaturan seperti di atas untuk layanan Anda (mereka tidak akan ada). Ingatlah untuk hanya menggunakan nama layanan (misalnya [layanananda.svc]) saat membuat dan menambahkan pengaturan. Lihat situs ini untuk info lebih lanjut https://robertsep.wordpress.com/2010/12/21/set-maximum-upload-filesize-sharepoint-wcf-service
sumber
Dalam kasus saya, saya harus meningkatkan "Ukuran pesan yang diterima maksimum" dari Lokasi Terima di BizTalk. Itu juga memiliki nilai default 64K dan setiap pesan dipantulkan oleh BizTAlk terlepas dari apa yang saya konfigurasikan di web.config saya
sumber
Saya bisa menyelesaikan ini dengan menjalankan panggilan palsu (misalnya IsAlive mengembalikan true) tepat sebelum permintaan dengan konten besar di saluran / klien wcf yang sama. Rupanya negotasi ssl dilakukan pada panggilan pertama. Jadi tidak perlu menambah Uploadreadaheadsize.
sumber
untuk masalah server jauh mengembalikan respons yang tidak terduga: (413) Permintaan Entitas Terlalu Besar di WCF dengan Resful
silakan lihat konfigurasi saya menjelaskan
</client> <serviceHostingEnvironment multipleSiteBindingsEnabled="false" aspNetCompatibilityEnabled="true"/> <bindings> <!-- this for restfull service --> <webHttpBinding> <binding name="RestfullwebHttpBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed"> <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" /> </binding> </webHttpBinding> <!-- end --> <!-- this for Soap v.2 --> <wsHttpBinding> <binding name="wsBinding1" maxReceivedMessageSize="2147483647" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/> <!--UsernameToken over Transport Security--> <security mode="TransportWithMessageCredential"> <message clientCredentialType="UserName" establishSecurityContext="true"/> </security> </binding> </wsHttpBinding> <!-- this for restfull service --> <!-- this for Soap v.1 --> <basicHttpBinding> <binding name="basicBinding1" maxReceivedMessageSize="2147483647" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false" transferMode="Streamed"> <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> <security mode="None"/> </binding> </basicHttpBinding> </bindings> <!-- end --> <services> <clear/> <service name="ING.IWCFService.CitisecHashTransfer" > <endpoint address="http://localhost:8099/CitisecHashTransfer.svc" behaviorConfiguration="RestfullEndpointBehavior" binding="webHttpBinding" bindingConfiguration="RestfullwebHttpBinding" name="ICitisecHashTransferBasicHttpBinding" contract="ING.IWCFService.ICitisecHashTransfer" /> </service> </services> <behaviors> <serviceBehaviors> <behavior name="ServiceBehavior"> <serviceMetadata httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> <dataContractSerializer maxItemsInObjectGraph="2147483647"/> <serviceCredentials> <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="ING.IWCFService.IWCFServiceValidator, ING.IWCFService"/> </serviceCredentials> <serviceSecurityAudit auditLogLocation="Application" serviceAuthorizationAuditLevel="SuccessOrFailure" messageAuthenticationAuditLevel="SuccessOrFailure"/> <serviceThrottling maxConcurrentCalls="1000" maxConcurrentSessions="100" maxConcurrentInstances="1000"/> </behavior> <behavior> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> <dataContractSerializer maxItemsInObjectGraph="2147483647"/> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="EndpointBehavior"> <dataContractSerializer maxItemsInObjectGraph="2147483647" /> </behavior> <behavior name="RestfullEndpointBehavior"> <dataContractSerializer maxItemsInObjectGraph="2147483647" /> <webHttp/> </behavior> </endpointBehaviors> </behaviors>
sumber
Dalam kasus saya, saya mendapatkan pesan kesalahan ini karena saya telah mengubah namespace layanan dan tag layanan diarahkan ke namespace lama. Saya menyegarkan namespace dan kesalahan hilang:
<services> <service name="My.Namespace.ServiceName"> <!-- Updated name --> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MyBindingConfiguratioName" contract="My.Namespace.Interface" <!-- Updated contract --> /> </service> </services>
sumber
Mendapat kesalahan serupa di IIS Express dengan Visual Studio 2017.
Selesaikan ini dengan mengedit
\.vs\config\applicationhost.config
. AlihkanserverRuntime
dariDeny
menjadiAllow
seperti ini:<section name="serverRuntime" overrideModeDefault="Allow" />
Jika nilai ini tidak diedit, Anda akan mendapatkan kesalahan seperti ini saat mengatur
uploadReadAheadSize
:Kemudian edit
Web.config
dengan nilai-nilai berikut:<system.webServer> <serverRuntime uploadReadAheadSize="10485760" /> ...
sumber