(413) Запит запиту надто великий | uploadReadAheadSize


136

Я написав сервіс WCF за допомогою .NET 4.0, який розміщений у моїй системі Windows 7 x64Ultimate з IIS 7.5. Один із методів обслуговування містить аргумент 'об’єкт', і я намагаюся надіслати байт [], який містить зображення. Поки розмір файлу цієї картинки менше ок. 48 КБ, все йде добре. Але якщо я намагаюся завантажити більшу картинку, сервіс WCF повертає помилку: (413) Request Entity Too Large. Тож, звичайно, я витратив 3 години на Googling повідомлення про помилку, і кожна тема, яку я бачив на цю тему, пропонує підвищити властивість 'uploadReadAheadSize'. Отже, що я зробив, це використання наступних команд (10485760 = 10 МБ):

"appcmd.exe set config -section:system.webserver/serverruntime/uploadreadaheadsize: 10485760 /commit:apphost"

"cscript adsutil.vbs set w3svc/<APP_ID>/uploadreadaheadsize 10485760"

Я також використовував IIS Manager для встановлення значення, відкривши сайт і перейшовши до "Редактора конфігурації" в розділі Управління. На жаль, я все ще отримую запит суб'єкта Занадто велика помилка, і це стає дуже неприємно!

Так хтось знає, що ще я можу спробувати виправити цю помилку?


6
10485760 = 10 МБ, а не 1 Мб
Шон Роуан

Відповіді:


206

Це не проблема IIS, а проблема WCF. WCF за замовчуванням обмежує повідомлення на 65 КБ, щоб уникнути відмови в сервісній атаці великими повідомленнями. Крім того, якщо ви не використовуєте MTOM, він надсилає байт [] до кодованого рядка base64 (збільшення на 33%) => 48 КБ * 1,33 = 64 КБ

Щоб вирішити цю проблему, потрібно перенастроїти службу, щоб вона приймала більші повідомлення. Раніше ця проблема випустила 400 помилок із поганим запитом, але в новій версії WCF почала використовувати 413, що є правильним кодом статусу для цього типу помилок.

Вам потрібно встановити maxReceivedMessageSizeу своїй палітурці. Ви також можете встановити readerQuotas.

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding maxReceivedMessageSize="10485760">
        <readerQuotas ... />
      </binding>
    </basicHttpBinding>
  </bindings>  
</system.serviceModel>

8
я встановив maxRecievedMessageSize на вказане вище значення, але все одно я отримую ту ж помилку .. Запит об’єкта занадто великий ..
Sandepku

11
@ Sandepku - Про всяк випадок ... у мене ця проблема була досить давно, а потім зрозуміла, що я неправильно назвала Ім'я прив'язки, тому WCF використовував значення за замовчуванням замість моїх значень конфігурації, і давав мені точне така ж помилка.
Адріан Карр

1
я встановив maxRecievedMessageSize на вищевказане значення, але все одно я отримую ту ж помилку .. Запит об'єкта занадто великий. Назва палітурки не порожня. Довідка!
NetSide

2
Дякую, сер, це було корисно одразу! Встановлення нового значення для maxReceivedMessageSize вимагає того ж значення для maxBufferSize.
DiligentKarma

1
@Sandepku, якщо ви використовуєте webhttpbinding для REST, можливо, вам знадобиться зробити ім'я прив'язки в <binding>, рівне пов'язуваннюConfiguration в <endpoint>
smoothumut

55

У мене була та сама проблема з IIS 7.5 зі службою WCF REST. Намагаючись завантажити через POST будь-який файл розміром понад 65k, він поверне помилку 413 "Запити об'єкт занадто великий".

Перше, що вам потрібно зрозуміти - це тип прив’язки, який ви налаштували в web.config. Ось чудова стаття ...

BasicHttpBinding vs WsHttpBinding vs WebHttpBinding

Якщо у вас є послуга REST, тоді вам потрібно налаштувати її як "webHttpBinding". Ось виправлення:

<system.serviceModel>

<bindings>
   <webHttpBinding>
    <binding 
      maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647" 
      maxBufferSize="2147483647" transferMode="Streamed">
    </binding>  
   </webHttpBinding>
</bindings>

2
Дякую, це працювало для мене за допомогою IIS 7.5 із послугою WCF REST. Насправді мені довелося лише змінити атрибут maxReceivedMessageSize.
Олексій Юлій

У мене був maxReceivedMessageSize, maxBufferSize зробив трюк, maxBufferPoolSize показав як недійсний атрибут.
JabberwockyDecompiler

4
переконайтеся, що ви визначили ім'я прив'язки та зробили його рівним значеннямConfiguration у кінцевій точці. Наприклад: <прив'язування name = "restLargeBinding" maxBufferPoolSize = ..........>. І в конфігурації послуги; <endpoint address = ""inding =" webHttpBinding "indingConfiguration = "restLargeBinding" .......
smoothumut

2
працює чудово, хоча встановлення transferMode = "Потокове" дало мені поганий запит, довелося його видалити
WtFudgE

1
@smoothumut Я знаю, що це старе, але прив'язка для ньогоConfiguration = "restLargeBinding" зробила для мене трюк! До речі, я використовую самообслуговуваний сервіс wcf.
ramires.cabral

26

У мене була та сама проблема, і налаштування її uploadReadAheadSizeвирішено:

http://www.iis.net/configreference/system.webserver/serverruntime

"Значення має бути від 0 до 2147483647."

Його легко встановити в applicationHost.config-fle, якщо ви не хочете робити cmd-річ.

Розташований у WindowsFOLDER\System32\inetsrv\config(сервер 2008 року).

Ви повинні відкрити його за допомогою блокнота. Спершу зробіть резервну копію файлу.

Відповідно до коментарів у налаштуваннях рекомендованим способом розблокування розділів є використання тегу місцезнаходження:

<location path="Default Web Site" overrideMode="Allow">
    <system.webServer>
        <asp />
    </system.webServer>
</location>"

Тож ви можете писати внизу (оскільки її раніше не було). Я пишу maxvalueтут - напишіть власну цінність, якщо хочете.

<location path="THENAMEOFTHESITEYOUHAVE" overrideMode="Allow">
    <system.webServer>
        <asp />
        <serverRuntime uploadReadAheadSize="2147483647" />
    </system.webServer>
</location>

Якщо, наприклад, поставити його останньою раніше </configuration>, ви знаєте, де у вас є.

Сподіваюся, що вирішує ваші проблеми. Для мене це було накладним випуском SSL, де занадто велика кількість публікацій заморозила додаток, викликаючи (413) Запит на об’єкт Занадто велика помилка.


1
Вже налаштувавши maxReceivedMessageSizeна int.MaxValue, це зробило трюк. Цікаво, чи є якісь основні проблеми з налаштуванням цього параметра для int.MaxValue?
Ленґдон

2
Хто-небудь знає, чи uploadReadAheadSize також стосується власних служб WCF, не працює через IIS? тобто це також проблема, пов’язана із Windows Server взагалі?
анткод

@antscode У мене є власний api, який страждає однаковою проблемою - ви вирішили це за допомогою самостійного сервісу?
Тревор Даніель

18

Я отримував це повідомлення про помилку, хоча у мене були встановлені maxналаштування в межах прив’язки мого конфігураційного файлу служби WCF:

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

Здавалося, ці параметри прив’язки не застосовуються, тому таке повідомлення про помилку:

IIS7 - (413) Запит занадто великого об'єкта під час підключення до послуги.

.

Проблема

Я зрозумів, що name=""атрибут в <service>тезі поля - web.configце не вільне текстове поле, як я вважав, що це. Це повністю кваліфікована назва виконання договору на послуги, як зазначено на цій сторінці документації .

Якщо це не відповідає, налаштування прив’язки не застосовуватимуться!

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

Я сподіваюся, що це рятує когось від болю ...


1
Дякуємо, що додали це рішення! Побічно вирішив мою проблему в тому, що назва мого контракту змінилася у програмі dev, але зміна не було розгорнуто належним чином до виробництва Перевірка цих параметрів вирішила мої (413) Запити запит на надто великі помилки через використання параметрів розміру повідомлень за замовчуванням.
Дуг Кнудсен

Я дуже радий, що це комусь допомогло. Я добре витратив час на це, тому сподівався, що це зробить чийсь день менш болісним.
Лука

9

Якщо ви зіткнулися з цією проблемою, незважаючи на те, що випробували всі рішення в цій темі, і підключаєтесь до служби через SSL (наприклад, https), це може допомогти:

http://forums.newatlanta.com/messages.cfm?threadid=554611A2-E03F-43DB-92F996F4B6222BC0&#top

Підсумовуючи підсумки (якщо посилання в майбутньому помер,), якщо ваші запити будуть досить великими, узгодження сертифікату між клієнтом і сервісом закінчиться випадковим чином. Щоб цього не сталося, потрібно ввімкнути певні налаштування для ваших прив'язок SSL. Ось з вашого сервера IIS, ось що вам потрібно зробити:

  1. Через cmd або powerhell запустіть netsh http show sslcert. Це дасть вам вашу поточну конфігурацію. Ви хочете якось зберегти це, щоб пізніше посилатися на нього.
  2. Ви повинні помітити, що "Сертифікат клієнта для переговорів" вимкнено. Це встановлення проблеми; Наступні кроки продемонструють, як це зробити.
  3. На жаль, немає можливості змінити наявні прив'язки; вам доведеться її видалити та знову додати. Запустіть, netsh http delete sslcert <ipaddress>:<port>де <ipaddress>:<port>знаходиться IP: порт, показаний у збереженій раніше конфігурації.
  4. Тепер ви можете знову додати прив'язку. Тут можна переглянути дійсні параметри netsh http add sslcert (MSDN), але в більшості випадків ваша команда буде виглядати так:

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

Якщо у вас є кілька прив'язок SSL, ви повторите процес для кожного з них. Сподіваюсь, це допомагає врятувати когось іншого години і години головного болю, яке викликало у мене це питання.

EDIT: На мій досвід, ви фактично не можете запустити netsh http add sslcertкоманду безпосередньо з командного рядка. Вам потрібно буде ввести спочатку мережевий рядок, набравши, netshа потім видавши свою команду, як http add sslcert ipport=...для того, щоб вона працювала.


Дякую за публікацію, вона допомогла вирішити проблему для нас, вимкнення SSL видаляє помилку WCF. На жаль, клієнтські переговори не змінили наш результат роботи над SSL. Stil шукає інші біти для перемикання :-(
Джафін

8

Це допомогло мені вирішити проблему (один рядок - розділення на читабельність / можливість копіювання):

C:\Windows\System32\inetsrv\appcmd  set config "YOUR_WEBSITE_NAME" 
     -section:system.webServer/serverRuntime /uploadReadAheadSize:"2147483647" 
     /commit:apphost

чи приймаєте ви свій WCF в середовищі SharePoint? і вам довелося перезапустити IIS після застосування змін?
theITvideos

2

Для мене, встановивши значення uploadReadAheadSizeto int.MaxValue, також виправили проблему, після того як також збільшили обмеження на прив'язку WCF.

Здається, що при використанні SSL все тіло об'єкта запиту попередньо завантажується, для чого використовується ця властивість метабази.

Для отримання додаткової інформації дивіться:

Сторінка не відображалася, оскільки об'єкт запиту завеликий. iis7


1
Ваші висновки про SSL та "uploadReadAheadSize" дуже хороші! .. Але я не рекомендую встановлювати його на максимальне значення, хоча
Учень

1

Для всіх, хто коли-небудь шукає помилку 413 WCS IIS: Запросити об'єкт великого розміру та використовувати службу WCF в Sharepoint, це інформація для вас. Установки в хості додатків та web.config, запропоновані на інших сайтах / публікаціях, не працюють у SharePoint, якщо використовується MultipleBaseAddressBasicHttpBindingServiceHostFactory. Ви можете використовувати SP Powershell, щоб отримати сервіс SPWebService.Content, створити новий об’єкт SPWcvSettings та оновити налаштування, як зазначено вище для вашої послуги (вони не існуватимуть). Не забудьте просто використовувати ім’я послуги (наприклад, [yourservice.svc]) під час створення та додавання налаштувань. Дивіться цей сайт для отримання додаткової інформації https://robertsep.wordpress.com/2010/12/21/set-maximum-upload-filesize-sharepoint-wcf-service


1

У моєму випадку мені довелося збільшити "Максимальний розмір отриманого повідомлення" з місця отримання в BizTalk. Це також має значення за замовчуванням 64K, тому BizTAlk відсилає кожне повідомлення незалежно від того, що я налаштував у своїй web.config


1

Мені вдалося вирішити це, виконавши фіктивний виклик (наприклад, IsAlive, що повертає справжнє) безпосередньо перед запитом з великим вмістом на тому ж wcf каналі / клієнті. Мабуть, домовленість про ssl проводиться під час першого дзвінка. Тому не потрібно збільшувати завантаженість голосів.


0

для видалення віддалений сервер повернув несподівану відповідь: (413) Запросити об'єкт занадто великий у WCF з Resful

будь ласка, дивіться мою конфігурацію пояснення

</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>


0

У моєму випадку я отримував це повідомлення про помилку, оскільки мені було змінено простір імен служби, а тег служб був вказаний на старішу область імен. Я оновив простір імен і помилка не зникає:

<services>
  <service name="My.Namespace.ServiceName"> <!-- Updated name -->
    <endpoint address="" 
              binding="wsHttpBinding" 
              bindingConfiguration="MyBindingConfiguratioName" 
              contract="My.Namespace.Interface" <!-- Updated contract -->
    />
  </service>
</services>

0

Отримала подібну помилку в IIS Express з Visual Studio 2017.

Помилка HTTP 413.0 - Запит запиту надто великий

Сторінка не відображалася, оскільки об'єкт запиту завеликий.

Найбільш вірогідні причини:

  • Веб-сервер відмовляється обслуговувати запит, оскільки об'єкт запиту занадто великий.

  • Веб-сервер не може обслуговувати запит, оскільки він намагається узгодити сертифікат клієнта, але об'єкт запиту занадто великий.

  • URL-адреса запиту або фізичне відображення до URL-адреси (тобто шлях фізичної файлової системи до вмісту URL-адреси) занадто довгий.

Що можна спробувати:

  • Переконайтеся, що запит дійсний.

  • Якщо ви використовуєте клієнтські сертифікати, спробуйте:

    • Збільшення system.webServer/serverRuntime@uploadReadAheadSize

    • Налаштуйте свою кінцеву точку SSL для узгодження сертифікатів клієнта як частини початкового рукостискання SSL. (netsh http додати sslcert ... clientcertnegotiation = включити) .vs \ config \ applicationhost.config

Вирішіть це шляхом редагування \.vs\config\applicationhost.config. Перемикання serverRuntimeз Denyдо Allowнаступним чином:

<section name="serverRuntime" overrideModeDefault="Allow" />

Якщо це значення не буде відредаговано, ви отримаєте подібну помилку під час налаштування uploadReadAheadSize:

Помилка HTTP 500.19 - внутрішня помилка сервера

Доступ до запитуваної сторінки не можна отримати, оскільки пов'язані дані конфігурації для сторінки недійсні.

Цей розділ конфігурації не можна використовувати на цьому шляху. Це відбувається, коли розділ заблокований на батьківському рівні. Блокування є або за замовчуванням (overrideModeDefault = "Заборонити"), або встановлено явно тегом локації з overrideMode = "Заборонити" або спадщиною enableOverride = "false".

Потім відредагуйте Web.configза допомогою таких значень:

<system.webServer>
  <serverRuntime uploadReadAheadSize="10485760" />
...

Якщо ви голосуєте проти, скажіть, чому. Дуже важко вдосконалити відповіді інакше.
Огглас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.