我正在开发一个WCF服务,该服务根据查询字符串参数(如起始页面,页面大小)返回记录集,如下所示:
/ {service-url} /?{some-other-parms}& pageindex = 0& pagesize = 9999& pagecount = 1
我最近遇到一种情况,当我请求所有记录时,浏览器(Chrome,FF,IE9)返回“页面无法显示”。它似乎在序列化过程中遇到异常。
我尝试使用这些参数并发现如果我设置& pagesize = 1598,结果将完美返回(作为浏览器上的XML)。如果我超越它,则会发生错误。因此,它返回的记录集中似乎有一个违规数据。但是,如果我调整参数实际上只返回看似有问题的数据,它会完美地返回结果。所以我现在怀疑它在序列化过程中是某种方式。该应用程序在它返回的记录类上使用DataContract。 但它似乎没有覆盖序列化过程(或者我没看到它做什么)。我该如何解决这个问题?
我已经在service方法中添加了一个步骤来记录它返回的记录数。在浏览器显示“无法显示页面”的情况下,日志表明它返回了非空记录集。所以我猜测序列化导致结果无效,因此浏览器无法渲染。
答案 0 :(得分:1)
这可能是因为您从服务中收到的消息大小。
有两件事要做。
在您的服务上设置诊断,以查看遇到的异常。
你在web.config文件中的:
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
<listeners>
<add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\log\Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
或者你们httpbindings扩展了maxReceivedMessageSize:
<binding name="BasicHttpEndpointBinding" sendTimeout="00:05:00" receiveTimeout="00:05:00" maxReceivedMessageSize="10485760">
答案 1 :(得分:0)
我为@MawedNabiZada提到了ServiceModel的跟踪日志记录。这最终给了我关于服务抛出异常的更多信息:
System.Runtime.Serialization.SerializationException抛出“最大值 可以在对象中序列化或反序列化的项目数 图是'65536'。更改对象图或增加 MaxItemsInObjectGraph quota。“
所以我必须将dataContractSerializer条目添加到我的web.config,在system.serviceModel下:
<system.serviceModel>
...
<behaviors>
<serviceBehaviors>
<behavior name="default" >
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
...
</behavior>
</serviceBehaviors>
</behaviors>
...
</system.serviceModel>
有关maxItemsInObjectGraph的更多信息,请参阅此MSDN page。