我有一个通过编程创建的自托管网络服务:
protected void StartService(Type serviceType, Type implementedContract, string serviceDescription)
{
Uri addressTcp = new Uri(_baseAddressTcp + serviceDescription);
ServiceHost selfHost = new ServiceHost(serviceType, addressTcp);
Globals.Tracer.GeneralTrace.TraceEvent(TraceEventType.Information, 0, "Starting service " + addressTcp.ToString());
try
{
selfHost.AddServiceEndpoint(implementedContract, new NetTcpBinding(SecurityMode.None), "");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
selfHost.Description.Behaviors.Add(smb);
System.ServiceModel.Channels.Binding binding = MetadataExchangeBindings.CreateMexTcpBinding();
selfHost.AddServiceEndpoint(typeof(IMetadataExchange), binding, "mex");
selfHost.Open();
ServiceInfo si = new ServiceInfo(serviceType, implementedContract, selfHost, serviceDescription);
try
{
lock (_hostedServices)
{
_hostedServices.Add(serviceType, si);
}
}
catch (ArgumentException)
{
//...
}
}
catch (CommunicationException ce)
{
//...
selfHost.Abort();
}
}
这段代码可以正常工作,但是当我尝试发送大块数据时,会出现以下异常:
错误:在尝试反序列化消息时,格式化程序抛出了一个异常:在尝试反序列化参数 @@@ 时发生错误。InnerException 消息为“在读取 XML 数据时已超出最大字符串内容长度配额(8192)。可以通过更改创建 XML 读取器时使用的 XmlDictionaryReaderQuotas 对象上的 MaxStringContentLength 属性来增加此配额。”请参阅 InnerException 以获取更多详细信息。位于:在 System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc) 处。
解决方案似乎是向绑定添加 MaxStringContentLength 属性。我知道如何在 Web.config 中实现它(link):
... binding name="wsHttpBindingSettings" maxReceivedMessageSize="2147483647">
我正在寻找一种在代码中修改绑定的maxReceivedMessageSize的方法。使用我正在使用的绑定类型是否可能实现?
谢谢。
编辑: 经过学习一些知识(并得到回复的指导),我理解了问题:我试图修改服务的MEX部分,该部分仅用于广告,参见link。 我应该修改NetTcpBinding的绑定(try语句中的第一行)。 现在我的(可工作的)代码如下:
...
try
{
//add the service itself
NetTcpBinding servciceBinding = new NetTcpBinding(SecurityMode.None);
servciceBinding.ReaderQuotas.MaxStringContentLength = 256 * 1024;
servciceBinding.ReaderQuotas.MaxArrayLength = 256 * 1024;
servciceBinding.ReaderQuotas.MaxBytesPerRead = 256 * 1024;
selfHost.AddServiceEndpoint(implementedContract, servciceBinding, "");
...
<ReaderQuotas>
子元素——那里是MaxStringContentLength
设置所在的地方。 - marc_s