2013-04-19 2 views
0

Я хочу отправить DataSet в службу WCF из приложения WPF. Когда я посылаю пустой DataSet, он отлично работает. Но DataSet с 30 DataTable это дает мне исключениеКак отправить большой набор данных в службу WCF?

Удаленный сервер возвратил неожиданный ответ: (400) Bad Request.

Мой контракт Операция:

[OperationContract] 
    string InsertDataToDatabase(DataSet ds); 

Что может быть лучшим способом отправить DataSet в службу WCF?

Client App.Config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="BasicHttpBinding_ICommunication" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
        useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" 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:49486/Communication.svc" 
       binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ICommunication" 
       contract="CommunicationReference.ICommunication" name="BasicHttpBinding_ICommunication" /> 
     </client> 
    </system.serviceModel> 
</configuration> 

Сервис Web.Config

<?xml version="1.0"?> 
<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <connectionStrings> 
    <add name="ConName" connectionString="Data Source=WIN-7;Initial Catalog=ABC; User ID=sa; Password=****"/>   
    </connectionStrings> 
    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding maxBufferSize="2147483647" 
       maxReceivedMessageSize="2147483647"> 
      <readerQuotas maxStringContentLength="2147483647" /> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <behaviors>  
     <serviceBehaviors> 
     <behavior> 
      <!--To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment--> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!--To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information--> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
      <serviceThrottling maxConcurrentCalls="100" maxConcurrentSessions="1000" maxConcurrentInstances="1600" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors>  
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 
+0

Вам необходимо настроить параметры привязки для службы. Можете ли вы опубликовать свой конфигурационный файл службы? – Tim

+0

Невозможно рассказать, не зная, в чем проблема с веб-службой. Вам нужно сначала изучить это. Если это услуга третьей стороны, запрашивайте информацию (или возможные ограничения веб-службы). Если это ваш сервис, сначала исследуйте себя. – Strelok

+0

@ Strelok, это мое местное обслуживание, я протестировал с пустым набором данных – Arshad

ответ

5

Я не помню, когда появляется сообщение с 400 ошибки для вопросов размера данных, но ... есть несколько вещей, которые вы можете попробовать.

Здесь есть несколько вещей. Во-первых, в соответствии с конфигурационным файлом вашей службы вы используете .NET 4.0. Это означает, что вы используете конечные точки по умолчанию - у вас нет явно определенных в конфигурации, поэтому среда создает для вас одну. И в этом случае используются значения по умолчанию для соответствующей привязки (BasicHttpBinding), что означает, что даже если вы измените значения в привязке, которую вы определяете, они не вступят в силу. Кроме того, вы получите поведение по умолчанию со значениями по умолчанию.

Попробуйте установить более высокое значение для maxReceivedMessageSize в привязке - по умолчанию 65536 - и maxStringContentLength (по умолчанию 8192 ~ 8K). Если вы увеличиваете размер maxStringContentLength, вам также необходимо увеличить размер maxBufferSize до того же значения (как минимум).

Теперь, поскольку у вас нет явно определенной конечной точки, вам нужно либо создать конечную точку, либо назначить привязку, которую вы ей определяете, или сделать определение, которое вы используете по умолчанию.

Во-первых, отображается обновленная версия вашей привязки (для обработки больших данных) (отображаются только соответствующие части, которые необходимо изменить). Я кратко опустил остальные для краткости. Я выбрал довольно большое число - для maxBufferSize и maxReceivedMessageSize max является максимальным значением Int64, а для maxStringContentLength максимальное значение является максимальным значением Int32.

<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_ICommunication" 
      maxBufferSize="2147483647" 
      maxReceivedMessageSize="2147483647"> 
     <readerQuotas maxStringContentLength="2147483647" /> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

Далее необходимо назначить это привязку конечной точке обслуживания. Самый простой способ, особенно если у вас есть только одна конечная точка, - сделать определение привязки выше значения по умолчанию. Вы делаете это, просто опуская атрибут name в элементе binding. Например:

<bindings> 
    <basicHttpBinding> 
    <binding maxBufferSize="2147483647" 
      maxReceivedMessageSize="2147483647"> 
     <readerQuotas maxStringContentLength="2147483647" /> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

Извещение нет name атрибута в указанном выше (раздели) конфигурации.

Второй способ - создать конечную точку и назначить ей конфигурацию привязки.Например:

<services> 
    <service name="MyServiceName"> 
     <endpoint address="" 
       binding="basicHttpBinding" 
       bindingConfiguration="BasicHttpBinding_ICommunication" 
       contract="MyService.IMyContract" /> 
    </service> 
</services> 

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

<behaviors> 
    <endpointBehaviors> 
    <behavior name="LargeDataBehavior"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483646" /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

Опять же, так как вы на .NET 4.0 вы будут либо необходимо определить такое поведение как поведение по умолчанию (опуская атрибут name) или назначить его на определенную конечную точку, как это (с помощью конечного примера выше):

<endpoint address="" 
      behaviorConfiguration="LargeDataBehavior" 
      binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_ICommunication" 
      contract="MyService.IMyContract" /> 

Вы также можете взглянуть на WCF Streaming.

+0

эти изменения должны быть сделаны на стороне клиента? – Arshad

+0

Нет, только на стороне обслуживания, поскольку служба получает (большое количество) данных. Если клиент будет получать аналогичные большие объемы данных из службы, вы также примените аналогичные изменения на стороне клиента. В этом случае, исходя из вашего вопроса, похоже, что их нужно применять только к стороне обслуживания. – Tim

+0

после обновления вашей второй привязки кода без имени, когда я запускаю файл svc, он по-прежнему отображает значения по умолчанию – Arshad

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