2013-10-02 5 views
1

В принципе, я извлекаю данные из SQL Server. Если я выбираю все данные (что составляет около 80 000 строк), то я получаю следующее сообщение об ошибке (Получение 100 строк работает отлично)
WCF, исключение из памяти при сериализации огромного количества данных

Exception of type 'System.OutOfMemoryException' was thrown. <br/> 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. <br/> 

Exception Details: System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 

Stack Trace: 

[OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.] 
    System.Text.StringBuilder.ToString() +29 
    System.IO.StringWriter.ToString() +14 
    System.Net.WebUtility.HtmlEncode(String value) +110 
    System.Web.Util.HttpEncoder.HtmlEncode(String value) +54 
    System.Web.UI.HtmlControls.HtmlContainerControl.set_InnerText(String value) +24 
    PerformanceCompare._Default.Page_Load(Object sender, EventArgs e) in C:\Users\KK33562\Documents\Visual Studio 2010\Projects\TestWebService\PerformanceCompare\Default.aspx.cs:34 
    System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14 
    System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35 
    System.Web.UI.Control.OnLoad(EventArgs e) +91 
    System.Web.UI.Control.LoadRecursive() +74 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2207 

Web.config (Client Side)

<system.serviceModel> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="endpointbehaviour"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_IService1" closeTimeout="00:50:00" 
     openTimeout="00:50:00" receiveTimeout="00:50:00" sendTimeout="00:50:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://localhost:53268/Service1.svc" binding="basicHttpBinding" 
    bindingConfiguration="BasicHttpBinding_IService1" contract="WCFService.IService1" 
    name="BasicHttpBinding_IService1" behaviorConfiguration="endpointbehaviour" /> 
</client> 
</system.serviceModel> 

Web.config (Server-Side)

<system.serviceModel> 
<behaviors>  
    <serviceBehaviors> 
    <behavior name="TestWCF.Service1Behavior"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483646"/> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
    <services> 
    <service name="TestWCF.Service1" behaviorConfiguration="TestWCF.Service1Behavior"> 
     <endpoint address="" binding="basicHttpBinding" contract="TestWCF.IService1" bindingConfiguration="BasicHttpBinding_IService1"> 
     <identity> 
      <dns value="localhost"/> 
     </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 
    </services>  
<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_IService1" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" openTimeout="00:50:00" closeTimeout="00:50:00" sendTimeout="00:50:00" receiveTimeout="00:10:00"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
     maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
</system.serviceModel> 
+0

Кажется довольно простым: «Исключение, которое возникает, когда памяти недостаточно для продолжения выполнения программы» http://msdn.microsoft.com/en-us/library/system.outofmemoryexception.aspx –

+0

@ DaveZiegler Спасибо за ваш ответ !. Я понимаю, что у меня проблема с управлением памятью. Мой вопрос в том, как я могу решить эту проблему. – Adrian

+0

Ну, сколько данных вы возвращаете? Сколько памяти доступно? Я не думаю, что это можно исправить в web.config. Можете ли вы вернуть меньше данных или вам нужны все 80000+ строк сразу? –

ответ

0

Если вы возвращение 80k строки из вашей службы, то я думаю, вы бы лучше избавиться от службы все вместе. Просто попросите клиента напрямую обращаться к БД, а затем они могут вытащить все строки, которые им нужны из БД.

EDIT

Введение пограничной службы, где это не нужно очень распространенная ошибка, и один я вижу, что происходит все больше и больше. В большинстве случаев было бы проще, если бы клиент вызывал базу данных напрямую с помощью NHibernate или даже ADO и хранимой процедуры или представления.

Если ваш клиент не может физически видеть базу данных в сети, вам, возможно, придется воспользоваться услугой.

+0

благодарю вас за ваш ответ! Не могли бы вы любезно предоставить пример? Я запутался в значении «избавиться от службы все вместе. Просто попросите клиента напрямую обращаться к БД» ... Я хочу, чтобы моя клиентская сторона была чистой .. – Adrian

+0

См. Обновление к моему ответу –

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