2011-01-06 2 views
3

У меня есть приложение, использующее WCF на стороне клиента и сервера. Я получаю ошибки, когда возвращаю большой объем данных:Программный набор MaxItemsInObjectGraph

При попытке сериализовать параметр http://tempuri.org/:GetCurrentDatabaseObjectsResult произошла ошибка. Сообщение InnerException: «Максимальное количество элементов, которые могут быть сериализованы или десериализованы в графе объектов, -« 65535 ». Измените график объекта или увеличьте квоту MaxItemsInObjectGraph. ». Дополнительную информацию см. В InnerException.

(главное, что я должен увеличить MaxItemsInObjectGraph).

Я нашел эту статью здесь: How can I set the maxItemsInObjectGraph property programmatically from a Silverlight Application?, но, похоже, это только для клиентской стороны, и мне нужно сделать это на сервере.

ответ

4

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/specifying-data-transfer-in-service-contracts#controlling-the-serialization-process

Спуститесь "Управление процессом сериализации" заголовок (или сделать поиск для maxItemsInObjectGraph)

+0

Фактически, я уже являлся пользовательским Serializer (для управления циклическими ссылками), он устанавливал значение MaxItemsInObjectGraph в значение по умолчанию, потому что он должен его выдавать. Я увеличил его, и теперь он работает. спасибо – J4N

+0

Полезно знать, и вы очень желанны. :) –

4

В коде:

foreach (OperationDescription op in factory.Endpoint.Contract.Operations) 
{ 
    DataContractSerializerOperationBehavior dataContractBehavior = 
       op.Behaviors.Find<DataContractSerializerOperationBehavior>() 
       as DataContractSerializerOperationBehavior; 
    if (dataContractBehavior != null) 
    { 
     dataContractBehavior.MaxItemsInObjectGraph = 100000; 
    } 
} 

В конфигурации:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehaivor"> 
     <serviceAuthorization impersonateCallerForAllOperations="True" /> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceThrottling maxConcurrentCalls="2147483647" /> 
     <dataContractSerializer maxItemsInObjectGraph="65775" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
2

Вы хотите указать недвижимость в ServiceBehavior attri Бьют.

[ServiceContract] 
[ServiceBehavior(MaxItemsInObjectGraph=100000)] 
public interface IDataService 
{ 
    [OperationContract] 
    DataPoint[] GetData(); 
} 
+6

Атрибут ServiceBehavior относится к классу реализации, а не к интерфейсу. – Sjoerd

+0

@Sjoerd - я второй, что –

Смежные вопросы