(413) Запросить объект слишком большой | UploadReadAheadSize

Я написал службу WCF с.NET 4.0, которая размещена на моей Windows 7 x64 Ультимативная система с IIS 7.5. Один из методов службы имеет в качестве аргумента "объект", и я пытаюсь отправить байт [], который содержит изображение. Пока размер файла этой картинки меньше, чем ок. 48KB, все идет хорошо. Но если я пытаюсь загрузить картинку большего размера, служба WCF возвращает ошибку: (413) Request Entity Too Large.Итак, я потратил 3 часа на поиски сообщения об ошибке, и каждая тема, которую я видел по этой теме, предлагает повысить свойство 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, чтобы установить значение, открыв сайт и перейдя в "Редактор конфигурации" в разделе "Управление". К сожалению, я все еще получаю ошибку Request Entity Too Large, и это очень расстраивает!

Так кто-нибудь знает, что еще я могу попытаться исправить эту ошибку?

16 ответов

Решение

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

Чтобы решить эту проблему, вы должны перенастроить свой сервис для приема больших сообщений. Эта проблема ранее вызвала ошибку 400 Bad Request, но в более новой версии WCF начал использовать 413, который является правильным кодом состояния для этого типа ошибки.

Вам нужно установить maxReceivedMessageSize в вашей привязке. Вы также можете установить readerQuotas,

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

У меня была такая же проблема с IIS 7.5 с REST-службой WCF. Попытка загрузить через POST любой файл выше 65 КБ, и он вернет ошибку 413 "Запросить объект слишком большой".

Первое, что вам нужно понять, это то, какую привязку вы настроили в файле web.config. Вот отличная статья...

BasicHttpBinding против WsHttpBinding против WebHttpBinding

Если у вас есть служба REST, вам необходимо настроить ее как "webHttpBinding". Вот исправление:

<system.serviceModel>

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

У меня была такая же проблема и настройка 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) Request Entity Too Large.

Я получал это сообщение об ошибке, хотя у меня было 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>

Я надеюсь, что это спасет кого-то от боли...

Если вы столкнулись с этой проблемой, несмотря на то, что пробовали все решения в этой теме, и вы подключаетесь к сервису через SSL (например, https), это может помочь:

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

Подводя итог (в случае, если ссылка умирает в будущем), если ваши запросы достаточно велики, согласование сертификата между клиентом и службой будет случайным образом терпеть неудачу. Чтобы этого не происходило, вам нужно включить определенные настройки в привязках SSL. С вашего сервера IIS, вот шаги, которые вам нужно сделать:

  1. С помощью cmd или powershell запустите 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, вы повторите процедуру для каждой из них. Надеюсь, это поможет кому-то сэкономить часы и часы головной боли, вызванной этой проблемой.

РЕДАКТИРОВАТЬ: По моему опыту, вы не можете запустить netsh http add sslcert Команда из командной строки напрямую. Сначала вам нужно будет ввести приглашение netsh, набрав netsh а затем введите команду http add sslcert ipport=... для того, чтобы это работало.

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

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

В моем случае я получал это сообщение об ошибке, потому что менялось пространство имен службы, а тег служб указывался на старое пространство имен. Я обновил пространство имен, и ошибка исчезла:

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

Для меня настройка uploadReadAheadSize в int.MaxValue также исправлена ​​проблема, также после увеличения ограничений на привязку WCF.

Кажется, что при использовании SSL предварительно загружается все тело объекта запроса, для которого используется это свойство метабазы.

Для получения дополнительной информации см.:

Страница не отображалась, поскольку объект запроса слишком велик. iis7

В моем случае мне пришлось увеличить "Максимальный размер получаемого сообщения" для местоположения получения в BizTalk. Это также имеет значение по умолчанию 64 КБ, поэтому BizTAlk отклоняет каждое сообщение независимо от того, что я настроил в своем файле web.config.

Я смог решить эту проблему, выполнив фиктивный вызов (например, IsAlive, возвращающий true) непосредственно перед запросом с большим контентом на том же канале / клиенте wcf. Судя по всему, ssl-связь происходит при первом вызове. Так что нет необходимости увеличивать Uploadreadaheadsize.

Моя проблема исчезла после того, как я добавил это:

        <system.webServer>
        <security>
            <requestFiltering>
                <requestLimits
                    maxAllowedContentLength="104857600"
                />
            </requestFiltering>
        </security>
  </system.webServer>

Для всех, кто когда-либо искал ошибку 413 WCF IIS: запросить объект большого размера и использовать службу WCF в Sharepoint, эта информация для вас. Параметры в приложении host и 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

Получил похожую ошибку на IIS Express с Visual Studio 2017.

Ошибка HTTP 413.0 - слишком большой объект запроса

Страница не отображалась, поскольку объект запроса слишком велик.

Наиболее вероятные причины:

  • Веб-сервер отказывается обслуживать запрос, поскольку объект запроса слишком велик.

  • Веб-сервер не может обслуживать запрос, потому что он пытается согласовать сертификат клиента, но объект запроса слишком велик.

  • URL-адрес запроса или физическое сопоставление с URL-адресом (т. Е. Путь физической файловой системы к содержимому URL-адреса) слишком длинный.

Вещи, которые вы можете попробовать:

  • Убедитесь, что запрос действителен.

  • Если вы используете клиентские сертификаты, попробуйте:

    • Увеличение system.webServer/serverRuntime@uploadReadAheadSize

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

Решите это, отредактировав \.vs\config\applicationhost.config, переключатель serverRuntime от Deny в Allow как это:

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

Если это значение не редактируется, вы получите такую ​​ошибку при настройке uploadReadAheadSize:

Ошибка HTTP 500.19 - внутренняя ошибка сервера

Запрашиваемая страница недоступна, потому что связанные данные конфигурации для этой страницы недействительны.

Этот раздел конфигурации не может быть использован по этому пути. Это происходит, когда раздел заблокирован на родительском уровне. Блокировка либо по умолчанию (overrideModeDefault="Deny"), либо устанавливается явно с помощью тега местоположения с помощью overrideMode="Deny" или устаревшего allowOverride="false".

Затем отредактируйте Web.config со следующими значениями:

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

Склеив множество ответов вместе, я получу ВСЮ информацию, которая мне нужна:

Конфигурация IIS: C:\Windows\System32\inetsrv\config\applicationHost.config (в самом низу)

      <?xml version="1.0" encoding="UTF-8"?>
<configuration>
...
<location path="Default Web Site">
        <system.webServer>
            <security>
                <access sslFlags="SslNegotiateCert" />
                <!-- Max upload size in bytes -->
                <requestFiltering>
                     <requestLimits maxAllowedContentLength="104857600" />
                </requestFiltering>
            </security>
        </system.webServer>
    </location>
</configuration>

Для проблемы удаленный сервер возвратил неожиданный ответ: (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>

На всякий случай, если у кого-то есть маршрутизатор запросов приложений перед своим приложением, убедитесь, что вы также настраиваете параметры и там.

Другие вопросы по тегам