Возврат большого файла JSON из службы AJAX - WCF - PullRequest
3 голосов
/ 13 июля 2011

У меня есть метод WebGet на основе AJAX, который возвращает JSON.Он не будет работать с результатами JSON из нескольких тысяч строк (если я возьму только около 100 строк, это сработает).Я замечаю, что браузер просто зависает и ничего не происходит, без какой-либо информации, показывающей консоль Firebug:

    [WebGet]
    public HttpTransactionTransformArgs Test()
    {
        HttpTransactionFilterArgs args = new HttpTransactionFilterArgs();

        args.Context = "MyDb";
        args.Entity = "MyDbRow";
        args.Key = "1";
        args.Option = null;

        HttpTransactionTransformArgs targs = new HttpDataPush().TransformRequest(args);

        return targs; 
    }

[DataContract]
[KnownType(typeof(HttpTransactionTransformArgs))]
[KnownType(typeof(HttpColumnDefinition))]
[KnownType(typeof(HttpDataRow))]
public class HttpTransactionTransformArgs
{
    [DataMember]    
    public string EntityName { get; set; }

    [DataMember]
    public List<HttpColumnDefinition> Schema { get; set; }

    [DataMember]
    public List<HttpDataRow> Data { get; set; }

    [DataMember]
    public bool TransactionSuccessful { get; set; }
}

А вот моя конфигурация на стороне сервера для WCF:

  <service name="Test.AJAXService" behaviorConfiguration="metadataBehavior">
    <endpoint address="" behaviorConfiguration="Test.AJAXServiceAspNetAjaxBehavior" 
              bindingConfiguration="webHttpConfig"
              binding="webHttpBinding" contract="Test.IAJAXServiceTest" />
  </service>

ЭтоКонфигурация webHttpBinding, которую я применяю:

      <webHttpBinding>
    <binding name="webHttpConfig" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"
              closeTimeout="00:30:00" openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00" >
      <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647"
                    maxDepth="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    </binding>
  </webHttpBinding>

И вот конечное поведение:

    <behavior name="Test.AJAXServiceAspNetAjaxBehavior">
      <enableWebScript />
      <webHttp defaultOutgoingResponseFormat="Json"  />
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>

Мне кажется, что все исчерпано, и оно должно работать, каким бы я ни былотсутствует

1 Ответ

5 голосов
/ 14 июля 2011

Я решил эту проблему, изменив атрибут dataContractSerializer в конфигурации metadataBehavior, потому что AJAXServiceAspNetAjaxBehavior было недостаточно.Он брал мой атрибут maxItemsInObjectGraph с уровня обслуживания, а не с конечного уровня:

<service name="Test.AJAXService" behaviorConfiguration="metadataBehavior">   
     <endpoint address="" behaviorConfiguration="Test.AJAXServiceAspNetAjaxBehavior"             
       bindingConfiguration="webHttpConfig"               
       binding="webHttpBinding" 
       contract="Test.IAJAXServiceTest" />   
</service> 

В metadataBehavior:

    <behavior name="metadataBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>
...