Web Service 或 WCF调用时读取 XML 数据时,超出最大字符串内容长度配额(8192)解决方法...

本文介绍了在使用WCF及WebService进行大数据传输时遇到的问题及其解决办法,包括调整MaxReceivedMessageSize和MaxStringContentLength等参数来提升传输效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.调用服务时服务

  当我们使用 Web Service 或 WCF 服务时,常把读取的数据转化为string类型(xml格式),当数据量达到一 定数量时,会出现以下异常:

    错误格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ (命名空间)进行反序列化时出错: InnerException 消息是“反序列化对象异常,读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。

2.原因及解决方案
 

 WCF传输大数据时,因为WCF本身的安全机制导致的,限制了客户端与服务器资源传输大小,当传输的数据超过上限后会产生异常。

 

     发送大数据:在WCF服务端解决

                  NetTcpBinding binding =  new NetTcpBinding();

            binding.MaxReceivedMessageSize= 2147483647(更改这个数字) ;

     接收大数据:在WCF客户端解决

            NetTcpBinding binding =  new NetTcpBinding();

            binding.ReaderQuotas = new XmlDictionaryReaderQuotas()

                  { MaxStringContentLength = 2147483647(更改这个数字) };

Web Service 调用时,在绑定代理端是,添加如下BasicHttpBinding:

 有两种方法处理:
  第一种:在调用时传入Binding参数。

    

 BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None)
                  { MaxReceivedMessageSize = int.MaxValue,
                    MaxBufferSize = int.MaxValue,
                    ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas()
                   { MaxStringContentLength = 2147483647 }
                  }
DLTEST.ServiceReference2.CS_WebServiceSoapClient svs = new DLTEST.ServiceReference2.CS_WebServiceSoapClient(binding);  

  第二种方法,改一下调用客户端的配置文件app.config

    增加binding节点下增加 readerQuotas节点控制

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="CS_WebServiceSoap" >
                  <readerQuotas maxDepth="64" maxStringContentLength="8192000" maxArrayLength="16384000"
                            maxBytesPerRead="4096000" maxNameTableCharCount="16384000" />
                </binding>
              <binding name="CS_WebServiceSoap1" >
                <readerQuotas maxDepth="64" maxStringContentLength="8192000" maxArrayLength="16384000"
                            maxBytesPerRead="4096000" maxNameTableCharCount="16384000" />
              </binding>
                <binding name="CS_WebServiceSoap2" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://10.0.0.251:100/WebService/CS_WebService.asmx"
                binding="basicHttpBinding" bindingConfiguration="CS_WebServiceSoap"
                contract="ServiceReference1.CS_WebServiceSoap" name="CS_WebServiceSoap" />
            <endpoint address="http://localhost:90/WebService/CS_WebService.asmx"
                binding="basicHttpBinding" bindingConfiguration="CS_WebServiceSoap1"
                contract="ServiceReference2.CS_WebServiceSoap" name="CS_WebServiceSoap1" />
            <endpoint address="http://localhost:3383/WebService/CS_WebService.asmx"
                binding="basicHttpBinding" bindingConfiguration="CS_WebServiceSoap2"
                contract="ServiceReference3.CS_WebServiceSoap" name="CS_WebServiceSoap2" />
        </client>
    </system.serviceModel>
</configuration>

  

 

IIS6缓冲区超过其配置限制 在IIS6上运行ASP的候,有候会出现:“IIS6缓冲区超过其配置限制”这个错误,原因是asp脚本最后产生的页面太大,超过缓冲区大小。我们的报表有服务器端分页,每页行数由用户设置,设置为0的候表示一页显示,这样,当数据太多并且一页显示的候会报错,比如有个固定资产的表,设置为每页30行的候有580页,可以正常显示,但是设置为每页0行的候就无法显示了,原来的代码处理的候,每当记录数超过一定范围的候(比如900条数据),就Respond.flush一下,清空缓冲区保证可以再使用。不过新版本代码中,没有合适的地方再加Respond.flush这一句,代码改起来比较麻烦。 从Google上搜索了一下解决办法,在这里集中一下,通通没有验证,不过应该有管用的;) 1.asp页面中合适的地方加入Respond.flush 以下都是各处copy的: -修改IIS配置的: 2.停止IIS服务,然后用记事本修改C:\WINDOWS\system32\inetsrv\MetaBase.xml 中的: AspBufferingLimit="4194304" //即默认4M 为: AspBufferingLimit="8388608" //改为8M更多 重启IIS 3.可以在“C:\Inetpub\AdminScripts”路径下在命令行中输入: adsutil set w3svc/2/root/autoupdate/aspbuf-feringlimit -1 adsutil set w3svc/aspbufferinglimit -1 命令来将缓存还原(默认大小为4MB),如果当前需要Response的大小超过这个限制,那么可以尝试将-1改为相应的大小,比如40MB就是41943040: adsutil set w3svc/aspbufferinglimit 41943040 注:2,3应该是殊途同归。 4.在IIS中"主目录"-"配置"-"选项",将启用缓存前面的勾去掉,即禁用缓存。 注:比较怀疑这个说法,即便管用,对性能应该也有一些影响。不过还是列出来,以后可以试一下。 -修改单个页面的: 5.可以通过服务器端iis里设置缓冲区大小,也可以通过程序更改这一值 注: buffer:他的值可以是"none"者一个数值。 指定处理JSP工作的out处理网页出入内容 的模式。如果值为none,那么就不会有缓存,而所有的输出都是由servletresponse的printerwriter。 若是一个数值,表示缓存的大小,单位是kb,那么输出的缓存大小至少会大于这个值。 根据autoFlush(可取true者false)属性而定,输入内容超出缓存大小是否要清除(true)还是产 生异常(false)。一般的,缓存设置为8kb以 6.可以在ASP应用程序的头部添加如下语句: 注:同4. 个人认为如果第5个办法管用的话,还是比较好的,比较环保。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值