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

122

Я написал службу WCF для .NET 4.0, которая размещена на моей Windows 7x64 Ультимативная система с IIS 7.5. Один из способов обслуживания имеет «объект» в качестве аргумента, и я пытаюсь отправить байт [], содержащий изображение. Пока размер файла этой картинки меньше, чем ок. 48КБ, все идет хорошо. Но если я пытаюсь загрузить картинку большего размера, служба 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, и это действительно расстраивает!

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

10485760 = 10 МБ, а не 1 МБ Shaun Rowan

Ваш Ответ

13   ответов
7

чтения / копирования):

C:\Windows\System32\inetsrv\appcmd  set config "YOUR_WEBSITE_NAME" 
     -section:system.webServer/serverRuntime /uploadReadAheadSize:"2147483647" 
     /commit:apphost
Вы размещаете свой WCF в среде SharePoint? и вам пришлось перезапустить IIS после применения изменений?
1

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

12

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) Request Entity Too Large when connecting to the service.

.

The Problem

Я понял, чтоname="" атрибут в<service> тег изweb.config являетсяnot свободное текстовое поле, как я и думал. Этоfully qualified name of an implementation of a service contract как упомянуто вэта страница документации.

Если это не соответствует, тогда настройки привязки не будут применены!

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

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

ты спас мой день :-) спасибо
Я очень рад, что это кому-то помогло. Я потратил много времени на это, так что я надеялся, что это сделает чей-то день менее болезненным.
Спасибо за добавление этого решения! Косвенно решил мою проблему в том, что имя моего контракта изменилось в dev, но это изменение не было должным образом внедрено в производство. Проверка этих настроек позволила устранить мои (413) слишком большие ошибки Entity Request из-за использования настроек размера сообщений по умолчанию.
1

запросить объект большого размера и использовать службу 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

0

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

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

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

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

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

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding maxReceivedMessageSize="10485760">
        <readerQuotas ... />
      </binding>
    </basicHttpBinding>
  </bindings>  
</system.serviceModel>
Вы, сэр, мой герой дня! kipusoep
Что бы вы установили для читателя Quotas?
Я установил для maxRectainedMessageSize указанное выше значение, но все равно получаю ту же ошибку. Сущность запроса слишком велика.
@ Sandepku- На всякий случай ... У меня была такая же проблема довольно долгое время, а затем я понял, что неправильно назвал имя привязки, поэтому WCF использовал значения по умолчанию вместо значений конфигурации и давал мне точную информацию. та же ошибка.
Спасибо, сэр, это было полезно сразу же! Установка нового значения для maxReceivedMessageSize требует, чтобы такое же значение было установлено для maxBufferSize.
24

uploadReadAheadSize решил это:

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

& quot; значение должно быть в диапазоне от 0 до 2147483647. & quot;

Его легко установить в 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 ошибка.

Вы размещаете свой WCF в среде SharePoint? и вам пришлось перезапустить IIS после применения изменений?
Уже установивmaxReceivedMessageSize к int.MaxValue, это добилось цели. Интересно, есть ли какие-либо серьезные проблемы с установкой этой опции на int.MaxValue?
@antscode У меня есть самодостаточный API-интерфейс, и у меня возникла та же проблема - вы решили эту проблему с помощью самостоятельно размещенного сервиса?
Я очень рад, что это кому-то помогло. Я потратил много времени на это, так что я надеялся, что это сделает чей-то день менее болезненным.
51

узить через 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>
@smoothumut Я знаю, что он старый, но bindingConfiguration = & quot; restLargeBinding & quot; сделал трюк для меня! Кстати, я использую самодостаточный сервис wcf.
Спасибо, это сработало для меня, используя IIS 7.5 с сервисом REST WCF. На самом деле мне нужно было только изменить атрибут maxReceivedMessageSize.
Роберт, просто и все же красота .....;)
убедитесь, что вы определили имя привязки и сделайте его равным привязке config в конечной точке. Например: & lt; имя привязки = & quot; restLargeBinding & quot; maxBufferPoolSize = .......... & GT ;. И в настройке сервиса; & lt; адрес конечной точки = & quot; & quot; связывание = & Quot; WebHttpBinding & Quot; bindingConfiguration = & Quot; restLargeBinding & Quot; .......
отлично работает, хотя установка TransferMode = & quot; Потоковый & quot; дал мне плохой запрос, пришлось удалить тот
4

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

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

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

Via cmd or powershell, run netsh http show sslcert. This will give you your current configuration. You'll want to save this somehow so you can reference it again later. You should notice that "Negotiate Client Certificate" is disabled. This is the problem setting; the following steps will demonstrate how to enable it. Unfortunately there is no way to change existing bindings; you'll have to delete it and re-add it. Run netsh http delete sslcert <ipaddress>:<port> where <ipaddress>:<port> is the IP:port shown in the configuration you saved earlier. Now you can re-add the binding. You can view the valid parameters for netsh http add sslcert here (MSDN) but in most cases your command will look like this:

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=... для того, чтобы это работало.

Спасибо за пост, это помогло изолировать проблему для нас, отключение SSL устраняет ошибку WCF. К сожалению, клиентские переговоры не изменили наш результат для работы по SSL. Стил ищет другие биты для переключения :-(
0

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

0

HTTP Error 413.0 - Request Entity Too Large

The page was not displayed because the request entity is too large.

Most likely causes:

The Web server is refusing to service the request because the request entity is too large.

The Web server cannot service the request because it is trying to negotiate a client certificate but the request entity is too large.

The request URL or the physical mapping to the URL (i.e., the physical file system path to the URL's content) is too long.

Things you can try:

Verify that the request is valid.

If using client certificates, try:

Increasing system.webServer/[email protected]

Configure your SSL endpoint to negotiate client certificates as part of the initial SSL handshake. (netsh http add sslcert ... clientcertnegotiation=enable) .vs\config\applicationhost.config

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

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

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

HTTP Error 500.19 - Internal Server Error

The requested page cannot be accessed because the related configuration data for the page is invalid.

This configuration section cannot be used at this path. This happens when the section is locked at a parent level. Locking is either by default (overrideModeDefault="Deny"), or set explicitly by a location tag with overrideMode="Deny" or the legacy allowOverride="false".

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

<system.webServer>
  <serverRuntime uploadReadAheadSize="10485760" />
...
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>

1

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

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

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

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

Похожие вопросы