WCF DefaultBinding не используется на новом WsHttpBinding
У меня есть сторонняя библиотека, которая подключается к веб-сервису в определенных конечных точках. С некоторыми услугами я получаю следующее исключение:
Message=The maximum nametable character count quota (16384) has been exceeded while reading XML data. The nametable is a data structure used to store strings encountered during XML processing - long XML documents with non-repeating element names, attribute names and attribute values may trigger this quota. This quota may be increased by changing the MaxNameTableCharCount property on the XmlDictionaryReaderQuotas object used when creating the XML reader. Line 1, position 1339.
Решение состоит в том, чтобы увеличить ReaderQuoata. WCF предлагает это через конфигурационные файлы.
Мой app.config теперь выглядит так:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding>
<readerQuotas maxNameTableCharCount="2147483647" />
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
</configuration>
Когда я сейчас создаю новый WsHttpBinding, его значение по-прежнему остается значением по умолчанию 16384.
class Program
{
static void Main(string[] args)
{
WSHttpBinding x = new WSHttpBinding();
Console.WriteLine(x.ReaderQuotas.MaxNameTableCharCount); //prints 16384
}
}
Что мне не хватает?
2 ответа
WSHttpBinding x = new WSHttpBinding();
создает новый экземпляр WSHttpBinding
со значениями по умолчанию рамки. Даже если у вас есть конфигурация привязки по умолчанию, определенная в файле конфигурации, она не используется вашим кодом (см. WSHttpBinding.cs для исходного кода). Другими словами, вызывая конструктор без параметров WSHttpBinding
не применяет привязку по умолчанию из каких-либо связанных файлов конфигурации, по крайней мере, я мог видеть.
У вас есть несколько вариантов здесь. Во-первых, дайте имя для конфигурации привязки в вашем файле конфигурации и укажите ссылку на нее. Во-вторых, присвойте значения XmlDictionaryReaderQuotas
когда вы создаете привязку программно.
Опция 1
<bindings>
<wsHttpBinding>
<binding name="MyBinding">
<readerQuotas maxNameTableCharCount="2147483647" />
</binding>
</wsHttpBinding>
</bindings>
WSHttpBinding x = new WSHttpBinding("MyBinding");
Вариант 2
WSHttpBinding x = new WSHttpBinding();
x.ReaderQuotas rq = new XmlDictionaryReaderQuotas();
rq.MaxNameTableCharCount = Int32.MaxValue;
Вы пробовали эту ссылку https://social.msdn.microsoft.com/Forums/vstudio/en-US/17592561-c470-452a-a52c-2a5a2839582c/metadataexchangeclient-and-nametable-character-count-quota?forum=wcf
это ошибка в нашем коде (передаваемая привязка игнорируется для HTTP-GET). Есть несколько обходных путей
Вы можете увидеть, будет ли какой-нибудь из них работать на вас?
- Является ли услуга услугой WCF? Если да, можете ли вы включить конечную точку mex в сервис? Привязка будет использоваться для работы конечной точки mex. Можно
- Вы используете протокол Discovery ( http://msdn2.microsoft.com/en-us/library/system.web.services.discovery.discoveryclientprotocol.aspx), чтобы получить метаданные из вашего сервиса? Считыватели XML, используемые этим
класс не имеет никаких квот.