Проблемы с readerQuotas в приложении ASP.NET - PullRequest
1 голос
/ 15 октября 2011

У меня есть приложение ASP.NET 4.0.

Веб-служба размещается с использованием файла .svc, связывающего источник (реализация службы).Файл веб-службы .svc расположен в каталоге WebServs в корневом каталоге приложения: MyApp/WebServs/mysvc.svc.

Веб-служба настроена с использованием Web.config (в корневом каталоге).

<!-- Service model -->
<system.serviceModel>
  <services>
    <service name="DataAccessService">
      <endpoint address=""
                binding="basicHttpBinding"
                bindingConfiguration="basicHttpBinding_ISRV"
                contract="MyNamespace.ISRV">
      </endpoint>
    </service>
  </services>

  <bindings>
    <basicHttpBinding>
      <binding name="basicHttpBinding_ISRV" maxReceivedMessageSize="2147483647">
        <readerQuotas maxStringContentLength="1310720" 
                      maxArrayLength="16384" 
                      maxBytesPerRead="24096" 
                      maxDepth="10000" 
                      maxNameTableCharCount="16384"/>
      </binding>
    </basicHttpBinding>
  </bindings>
  <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

OK!

Когда я вызываю веб-сервис, я создаю канал, используя подпрограмму для инкапсуляции этой обычно используемой логики:

public static ISRV GetService() {
  try {
    // Create the service endpoint
    BasicHttpBinding bhttpb = new BasicHttpBinding(
      BasicHttpSecurityMode.TransportCredentialOnly);
    bhttpb.MaxReceivedMessageSize = 2147483647;
    bhttpb.ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas();
    bhttpb.ReaderQuotas.MaxArrayLength = 16384);
    bhttpb.ReaderQuotas.MaxBytesPerRead = 24096);
    bhttpb.ReaderQuotas.MaxDepth = 10000);
    bhttpb.ReaderQuotas.MaxNameTableCharCount = 16384);
    bhttpb.ReaderQuotas.MaxStringContentLength = 1310720);

    ServiceEndpoint httpEndpoint =
      new ServiceEndpoint(
        ContractDescription.GetContract(typeof(ISRV)),
        bhttpb,
        new EndpointAddress());

    // Create channel factory and get proper channel for service.
    ChannelFactory<ISRV> channelFactory = new ChannelFactory<ISRV>(httpEndpoint);

    IDAS svc = channelFactory.CreateChannel();

    return svc;
  } catch (Exception e) {
    throw new DASException("DAS Exception: " + e.Message);
  }
}

Эта подпрограммавызывается клиентами.В то время как Web.config используется для настройки стороны службы сервера.

Когда я пытаюсь выполнить свою службу с большими сообщениями (с крошечными сообщениями, все в порядке), я получаю:

При попытке десериализации сообщения форматер выдал исключение: при попытке десериализации параметра произошла ошибка http://((Namespace)):((Operation)). Сообщение InnerException было «Произошла ошибка при десериализации объекта типа ((Type)), App_Code.s5qoir2n,Версия = 0.0.0.0, Культура = нейтральная, PublicKeyToken = null]].Максимальная квота длины строки содержимого (8192) была превышена при чтении данных XML.Эту квоту можно увеличить, изменив свойство MaxStringContentLength в объекте XmlDictionaryReaderQuotas, используемом при создании средства чтения XML.Строка 31, позиция 1309. '.Пожалуйста, смотрите InnerException для более подробной информации.

Не понимаю.И сервис, и клиент имеют общие настройки, и это считывает значения по умолчанию ?????Кроме того, я сделал так же, как и многие другие пользователи, следуя инструкциям здесь, в StackOverflow.

Пожалуйста, помогите мне.Thankyou

1 Ответ

1 голос
/ 16 октября 2011

Вы указали WCF 4.0 (ну, точнее, ASP.NET 4.0), поэтому мне интересно, если проблема, с которой вы сталкиваетесь, заключается в том, что вы на самом деле достигаете конечной точки по умолчанию, которая будет использовать значения по умолчанию для привязки, если тольков противном случае переопределяется?

WCF 4.0 предоставит конечную точку по умолчанию (в которой указано расположение службы).Эта конечная точка по умолчанию, скорее всего, будет использовать значения по умолчанию для привязки (8192 в случае MaxStringContentLength).

Поскольку вы выполняете всю конфигурацию для службы в каталоге над каталогом WebServs (корнем),возможно, он прибегает к конечной точке по умолчанию?Я понимаю, что файлы Web.config будут наследоваться от приведенных выше, но это, по крайней мере, следует учитывать, если вы этого еще не сделали.

Дополнительная информация о конечных точках по умолчанию и других изменениях для 4.0 может бытьможно найти здесь: Введение разработчика в Windows Communication Foundation 4

...