WCF服务结果导致浏览器无法显示'页面'在某些情况下

时间:2014-09-16 08:08:58

标签: wcf datacontractserializer

我正在开发一个WCF服务,该服务根据查询字符串参数(如起始页面,页面大小)返回记录集,如下所示:

  

/ {service-url} /?{some-other-parms}& pageindex = 0& pagesize = 9999& pagecount = 1

我最近遇到一种情况,当我请求所有记录时,浏览器(Chrome,FF,IE9)返回“页面无法显示”。它似乎在序列化过程中遇到异常。

我尝试使用这些参数并发现如果我设置& pagesize = 1598,结果将完美返回(作为浏览器上的XML)。如果我超越它,则会发生错误。因此,它返回的记录集中似乎有一个违规数据。但是,如果我调整参数实际上只返回看似有问题的数据,它会完美地返回结果。所以我现在怀疑它在序列化过程中是某种方式。该应用程序在它返回的记录类上使用DataContract。 但它似乎没有覆盖序列化过程(或者我没看到它做什么)。我该如何解决这个问题?

我已经在service方法中添加了一个步骤来记录它返回的记录数。在浏览器显示“无法显示页面”的情况下,日志表明它返回了非空记录集。所以我猜测序列化导致结果无效,因此浏览器无法渲染。

2 个答案:

答案 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