2014-11-04 2 views
0

я не собираюсь говорить об ошибкеWCF - Ошибка при получении большого объема данных

Максимальный размер сообщения квоты для входящих сообщений (65536) был превышен. Чтобы увеличить квоту, используйте свойство MaxReceivedMessageSize для соответствующего элемента привязки.

Я услугу ФОС, который подключается к Microsoft Dynamics CRM, я начал проект как .NET 4.5 однако сервер, на котором он будет размещен может размещаться только .NET 3.5.

Когда я изменил структуру проекта WCF, некоторые Операционные контракты перестали работать, когда данные, которые он возвращает, являются средними (как 1000 элементов внутри массива).

Я проверил XML, и он имеет ~ 1mb, поэтому я не думаю, что речь идет о Quotas.

Ошибка я получаю:

Клиент нашел тип содержимого ответа на '', но ожидаемый 'текст/XML'. Ошибка запроса с пустым ответом.

Server Side:

public account[] GetX(DateTime? Range) 
{ 
    Service svc = Helper.CreateService(); 
    account[] arr = null; 

    if (Range == null) 
     arr = svc.GetAllX(); 
    else 
     arr = svc.GetAllXByDate(Range.Value); 

    return arr; 
} 

Web-Config system.serviceModel:

<system.serviceModel> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="myBasicHttpBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" 
      maxArrayLength="16348" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 

    <services> 
    <service name="OROC.Proxy.ProxyService" behaviorConfiguration="ServiceBehaviors"> 
     <endpoint name="Endpoint" 
       binding="basicHttpBinding" 
       bindingConfiguration="myBasicHttpBinding" 
       contract="OROC.Proxy.IProxyService" /> 
    </service> 
    </services> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name="ServiceBehaviors"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <!--<protocolMapping> 
    <add binding="basicHttpsBinding" scheme="http" /> 
    </protocolMapping>--> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
</system.serviceModel> 

О, и ошибка происходит, когда это возвращение предметов, а не в обратном обр ;, сразу после окончания метода. Скрипач ловит все XML, так что я думаю, что проблема стороне клиента

EDIT 1 04/10/2014 10:09

стороне клиента:

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 

    <bindings> 
    <basicHttpBinding> 
     <binding name="myBasicBinding" maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"> 
     <readerQuotas maxDepth="128" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
    </serviceBehaviors> 

    <endpointBehaviors> 
     <behavior name="ServiceBehaviour"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 

    <client> 
    <endpoint name="basicEndpoint" 
     address="http://localhost:58364/ProxyService.svc" 
     binding="basicHttpBinding" 
     bindingConfiguration="myBasicBinding" 
     contract="*" 
     behaviorConfiguration="ServiceBehaviour"> 
    </endpoint> 
    </client> 

</system.serviceModel> 

EDIT 2 04/10/2014 10:34

Я протестировал XML с IE, и он не разобрался правильно, однако, когда Я открыл xml с визуальной студией, он предупредил меня о символах Юникода, и он заменил их, затем я сохранил файл и снова открыл IE, и он был правильно разобран. Эта информация может быть полезна.

Кто-нибудь имеет идеи? Спасибо заранее.

ответ

0

Я решил это!

Я обнаружил, что мне нужно было увеличить maxItemsInObjectGraph, но я не мог, что бы я ни сделал.

Как я его нашел? и как я решил проблему?

Первая проблема: Я добавил ссылку в качестве ссылки в Интернете, а не ServiceReference, и я не мог поместить ServiceBehavior и конечную точку работы.

Вторая проблема: мне нужно включить TRACEFILE, так что я мог видеть больше, чем просто простой

Сервер не обеспечивает значимый ответ; это может быть вызвано несоответствием контракта, преждевременной остановкой сеанса или ошибкой внутреннего сервера

Третьей проблема: ServiceModel в web.config должен был быть равен как в серверной и клиентской стороне.

Разрешение: Сначала я удалил ссылку на веб-сайт и добавил ссылку на службу, когда я сделал это, мне нужно было изменить некоторые методы в кодировке (на стороне клиента).

Затем я сопоставил web.config.

Client-Side WebConfig

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 

    <bindings> 
    <basicHttpBinding> 
     <binding name="myBasicBinding" receiveTimeout="00:10:00" closeTimeout="00:10:00" sendTimeout="00:10:00" openTimeout="00:10:00" maxBufferPoolSize="524288" maxBufferSize="2147483647" 
     maxReceivedMessageSize="2147483647"> 
     <security mode="None" /> 
     <readerQuotas maxDepth="128" maxStringContentLength="2147483647" 
      maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     </binding> 
     <binding name="Endpoint" /> 
    </basicHttpBinding> 
    </bindings> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
     </behavior> 
    </serviceBehaviors> 

    <endpointBehaviors> 
     <behavior name="ServiceBehaviour"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 

    <client> 
    <endpoint address="http://localhost:58364/ProxyService.svc" behaviorConfiguration="ServiceBehaviour" 
     binding="basicHttpBinding" bindingConfiguration="myBasicBinding" 
     contract="ProxyService.IProxyService" name="basicEndpoint" /> 
    </client> 
</system.serviceModel> 

Серверное WebConfig

<system.serviceModel> 
    <extensions> 
    <bindingElementExtensions> 
     <add name="customTextMessageEncoding" type="Microsoft.ServiceModel.Samples.CustomTextMessageEncodingBindingSection, CustomTextMessageEncoder" /> 
    </bindingElementExtensions> 
    </extensions> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="myBasicHttpBinding" receiveTimeout="00:10:00" closeTimeout="00:10:00" sendTimeout="00:10:00" openTimeout="00:10:00" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
     <security mode="None" /> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" 
      maxArrayLength="16348" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 

    <services> 
    <service name="OROC.Proxy.ProxyService" behaviorConfiguration="ServiceBehaviors"> 
     <endpoint name="Endpoint" 
       binding="basicHttpBinding" 
       bindingConfiguration="myBasicHttpBinding" 
       contract="OROC.Proxy.IProxyService" /> 
     <!--<endpoint kind="udpDiscoveryEndpoint" binding="ProxyService" />--> 
    </service> 
    </services> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name="ServiceBehaviors"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
</system.serviceModel> 

Чтобы узнать, какие проблемы я имел, я просто позволил TRACEFILE на стороне сервера WebConfig и открыл файл с программой по умолчанию (Microsoft Service Trace Viewer).

Диагностика

<system.diagnostics> 
    <trace autoflush="true"/> 
    <sources> 
    <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true"> 
     <listeners> 
     <add name="sdt" type="System.Diagnostics.XmlWriterTraceListener" initializeData="TraceFile.svclog"/> 
     </listeners> 
    </source> 
    </sources> 
</system.diagnostics> 
0

Вы установили maxReceivedMessageSize = "2147483647" на клиенте?

+0

Я обновил пост проверить ** EDIT 1 ** –

+0

нормально я обновил снова пост –

+0

Что делать, если вы просто отправить 1 элемент в массиве делает эту работу ? –

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