WCF DefaultBinding 未用于新的 WsHttpBinding
WCF DefaultBinding not used on new WsHttpBinding
我有一个在特定端点连接到网络服务的第 3 方库。
对于某些服务,我得到以下异常:
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
}
}
我错过了什么?
this is a bug in our code (the binding you pass is ignored for
HTTP-GET). There are a few workarounds
can you see if any of them will work for you?
- Is the service a WCF service? If so, can you enable a mex endpoint on the service? The binding will be used work for the mex endpoint.
Can
- you use the Discovery protocol(http://msdn2.microsoft.com/en-us/library/system.web.services.discovery.discoveryclientprotocol.aspx)
to get the metadata from your service? The XML readers used by this
class don’t have any quotas.
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;
我有一个在特定端点连接到网络服务的第 3 方库。 对于某些服务,我得到以下异常:
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
}
}
我错过了什么?
this is a bug in our code (the binding you pass is ignored for HTTP-GET). There are a few workarounds
can you see if any of them will work for you?
- Is the service a WCF service? If so, can you enable a mex endpoint on the service? The binding will be used work for the mex endpoint. Can
- you use the Discovery protocol(http://msdn2.microsoft.com/en-us/library/system.web.services.discovery.discoveryclientprotocol.aspx) to get the metadata from your service? The XML readers used by this
class don’t have any quotas.
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;