ASP.NET, размещающий WCF Services, должен увеличить MaxStringContentLength, но как?

Мой сервер ASP.NET предоставляет набор служб WCF, которые используются моим клиентом WPF. Все работало нормально, пока длина строкового поля не превысила 8К. Теперь это создает следующее исключение на сервере ASP.NET...

Произошла ошибка при десериализации объекта типа Project.ModelType. Максимальная квота длины строки содержимого (8192) была превышена при чтении данных XML. Эту квоту можно увеличить, изменив свойство MaxStringContentLength в объекте XmlDictionaryReaderQuotas, используемом при создании средства чтения XML.

Я увеличил значение MaxStringContentLength до 64 КБ в WPF app.config, но это не решило проблему. Поэтому я думаю, мне нужно увеличить это значение и на стороне ASP.NET. Но у меня нет никаких значений в web.config для изменения! Вот мой web.config, чтобы показать это...

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />

    <authentication mode="Forms">
      <forms name=".ASPXFTOAUTH"
             timeout="10"
             slidingExpiration="true"
             cookieless="UseCookies"/>
    </authentication>

    <membership>
      <providers>
        <clear/>
      </providers>
    </membership>

    <customErrors defaultRedirect="~/Error.htm" mode="RemoteOnly">
      <error statusCode="404" redirect="~/404.aspx" />
    </customErrors>
  </system.web>

  <system.webServer>
     <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
                               multipleSiteBindingsEnabled="true" />
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Итак, как мне обновить сервер, чтобы указать более высокое значение MaxStringContentLength? App.config для моего сервиса выглядит так...

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="BasicHttpBinding_IAccess" closeTimeout="00:01:00"
               openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
               allowCookies="false" bypassProxyOnLocal="false"
               hostNameComparisonMode="StrongWildcard"
               maxBufferSize="131072" maxBufferPoolSize="524288" maxReceivedMessageSize="131072"
               messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
               useDefaultWebProxy="true">
        <readerQuotas maxDepth="32" maxStringContentLength="65536" maxArrayLength="16384"
                      maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        <security mode="None">
          <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
          <message clientCredentialType="UserName" algorithmSuite="Default" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings>

  <client>
    <endpoint binding="basicHttpBinding"
              bindingConfiguration="BasicHttpBinding_IAccess" 
              contract="AccessService.IAccess"
              name="BasicHttpBinding_IAccess" />
  </client>
</system.serviceModel>

Есть идеи?

ОБНОВИТЬ:

Мои сервисы определяются наличием класса Access.svc

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Access : IAccess
{
    // ...IAccess method implementations
}

... который имеет следующую разметку...

<%@ ServiceHost Language="C#" Debug="true" 
                Service="Ecotech.AMS.WebServer.Access" 
                CodeBehind="Access.svc.cs" %>

... нет ничего конкретного о сервисе в web.config, как отмечено в комментариях.

2 ответа

Попробуйте нажать "Добавить ссылку на сервис" в контекстном меню вашего проекта. Это добавит необходимую информацию о конфигурации в ваш файл web.config.

Как только вы это сделаете, вы можете установить maxReceivedMessageSize собственность на вашу привязку. Это будет наиболее точно отражать то, что вы делаете на стороне службы WCF.

Место, где вам нужно работать, - это веб-конфигурация, вам нужно добавить сервисы поведения, где вы можете установить размер данных. Например, вот так,

<behaviors>
      <serviceBehaviors>
        <behavior name="SilverlightWCFLargeDataApplication">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>

      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="SilverlightWCFLargeDataApplication">
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </endpointBehaviors>
    </behaviors>

если это не сработает, опубликуйте здесь свой веб-конфиг. Надеюсь, это поможет.

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