Проблемы с readerQuotas в приложении ASP.NET
У меня есть приложение 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>
ХОРОШО!
Когда я вызываю веб-сервис, я создаю канал, используя подпрограмму для инкапсуляции этой обычно используемой логики:
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: // ((Пространство имен)): ((Операция)) произошла ошибка. Сообщение InnerException было "Произошла ошибка при десериализации объекта типа ((Тип)), App_Code.s5qoir2n, Версия =0.0.0.0, Культура = нейтральный, PublicKeyToken= ноль]]. Максимальная квота длины строки содержимого (8192) была превышена при чтении данных XML. Эту квоту можно увеличить, изменив свойство MaxStringContentLength в объекте XmlDictionaryReaderQuotas, используемом при создании средства чтения XML. Строка 31, позиция 1309.'. Пожалуйста, смотрите InnerException для более подробной информации.
Не понимаю И сервис, и клиент имеют общие настройки, и это считывает значения по умолчанию????? Кроме того, я сделал так же, как и многие другие пользователи, следуя инструкциям здесь, в Stackru.
Пожалуйста, помогите мне. Спасибо
1 ответ
Вы указали WCF 4.0 (ну, точнее, ASP.NET 4.0), поэтому мне интересно, если проблема, с которой вы сталкиваетесь, заключается в том, что вы на самом деле достигаете конечной точки по умолчанию, которая будет использовать значения по умолчанию для привязки, если не будет переопределено иное?
WCF 4.0 предоставит конечную точку по умолчанию (укажите, где находится сервис). Эта конечная точка по умолчанию, скорее всего, будет использовать значения по умолчанию для привязки (8192 в случае MaxStringContentLength).
Поскольку вы выполняете все настройки для службы в каталоге над каталогом WebServs (корневым), возможно, он прибегает к конечной точке по умолчанию? Я понимаю, что файлы Web.config будут наследоваться от вышеупомянутых, но это, по крайней мере, стоит рассмотреть, если вы этого еще не сделали.
Дополнительную информацию о конечных точках по умолчанию и других изменениях для 4.0 можно найти здесь: Введение разработчика в Windows Communication Foundation 4