CommunicationException与XML返回值大小限制(81,920 bytes)

环境说明
我们项目中使用了一个Web Service,返回List对象,在SOAP中即构成了XML格式字符串返回客户端。
客户端使用WebServiceSoapClient类调用Web Methods。
使用的开发环境是Visual Studio 2008,.NET Framework 3.0,部署在Windows Server 2003上。全部采用英文版。

问题说明
某个返回List的Web Method,一向工作正常。某日在数据库添加了一条记录之后,开始出现Exception。Visual Studio 2008调试报错:
A first chance exception of type ‘System.ServiceModel.CommunicationException’ occurred in mscorlib.dll

然后我们分析认为,是这条记录格式有问题,我们把原记录中“BLACKMAGIC”字符串改成“BLACKMAGIC2”,问题依旧;改成“BLACKMAGI”,问题不见了…
于是第一次就这样了。

过几天又插入一堆记录,CommunicationException又出现了。这一次我试图调整List中包含元素的个数,发现134个可以,而135个不行。猜测Web Service返回的XML字符串有长度限制。本地调试,手动保存了134个和135个返回的XML文件,查看大小,134条记录的文件大小,著名的81,920 bytes给了我重要的猜测证据。

经过一番Google,翻了几个网站,整理得到的解决方案如下:
之前我们使用简单的WebServiceSoapClient构造,会导致81,920 bytes是Web Service XML返回值的最大大小限制:

[code=’c#’]
WebServiceSoapClient proxy = new ITS.ServiceReference.WebServiceSoapClient();
[/code]

使用另一种构造函数并设置返回消息最大值:

[code=’c#’]
System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
binding.MaxReceivedMessageSize = int.MaxValue;
System.ServiceModel.EndpointAddress address = new System.ServiceModel.EndpointAddress(“http://serveraddress/webservicename.asmx”);
WebServiceSoapClient proxy = new ITS.ServiceReference.WebServiceSoapClient(binding, address);
[/code]

则问题解决。原来第一次去掉一个字符,刚刚好够81,920 bytes。

发表评论