Thursday, November 22, 2012

Change the object graph or increase the MaxItemsInObjectGraph quota


We are suing WCF RIA services for our Silverlight application  for data Access.Suddenly We got an error for some of the Service requests as "Request Aborted"  in Firebug.

After adding below diagnostics code to my web.config file,I ran the application one more time.


<system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\Traces.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
When I opened the Svclog file, I came to know the exact cause of this Request aborted Exception. Below is the Exception details,
There was an error while trying to serialize parameter http://tempuri.org/:GetOrdersResult. The InnerException message was 'Maximum number of items that can be serialized or deserialized in an object graph is '65536'. Change the object graph or increase the MaxItemsInObjectGraph quota. '.  Please see InnerException for more details.
I googled for this Exception and all are saying that I need to restrict the results to a specific number and I can achieve this by pagination. I understood that, this the feasible solution , but it costs me an extra effort of some more billing hours and our client is not willing to do so.
When I closely observed my config settings as shown below,

<system.serviceModel>
    <services>
      <service behaviorConfiguration="MyApp.Web.Services.MyAppDomainService" name="MyApp.Web.Services.MyAppDomainService"></service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyApp.Web.Services.MyAppDomainService">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceThrottling maxConcurrentSessions="2147483647" maxConcurrentInstances="2147483647" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!--To Use Session variables in the Services-->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
I have set it to the max length of an Integer value that is 2147483647,but in the Exception details It is saying that the value is set to 65536. After a lot of R and D , I came to know from Stack Exchange forums that when we are using more than one Web service, in our project, then we should remove Service specific settings from the web.config file.