2011-12-22 3 views
0

Была попытка решить это за один день. Я не могу найти ошибку с моим кодом, пожалуйста, помогите. Спасибо! Я использую IIS для размещения Сервиса и использую ссылку на сервисную службу для клиента. Я убедился, что добавил readquota и правильную конфигурацию привязки. Тем не менее, ошибка возникает, когда я отправляю файл с размером более 16384kb.WCF 16384 максимальная длина массива

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

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_ICotfServerWCF" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="20000000" maxBufferPoolSize="20000000" maxReceivedMessageSize="20000000" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" 
     maxStringContentLength="5242880" 
     maxArrayLength="2147483646" 
     maxBytesPerRead="4096" 
     maxNameTableCharCount="5242880" /> 
      <security mode="None"> 
      <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
     <service name="ServerWCF.ICotfServerWCF"> 
     <endpoint address="http://192.168.2.140:8081/CotfServerWCF.svc" binding="basicHttpBinding" behaviorConfiguration="filebehavior" name="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ICotfServerWCF" contract="ServerWCF.ICotfServerWCF" /> 
     </service> 
    </services> 



    <behaviors> 
     <endpointBehaviors> 
     <behavior name="filebehavior"> 
      <dataContractSerializer maxItemsInObjectGraph="2000000000"/> 
     </behavior> 
     </endpointBehaviors> 
     <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="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

    <connectionStrings> 
    <add name="databaseCS" connectionString="Data Source=(local);Initial Catalog=CotfDatabase;User ID=CotfDbUser; Password=$ing1234;"/> 
    </connectionStrings> 
</configuration> 



Client 
<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="BasicHttpBinding_Client" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferSize="6553600" maxBufferPoolSize="5242880" maxReceivedMessageSize="6553600" 
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
        useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="100000" 
         maxBytesPerRead="4096" maxNameTableCharCount="100000" /> 
        <security mode="None"> 
         <transport clientCredentialType="None" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="UserName" algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://192.168.2.140:8081/CotfServerWCF.svc" 
       binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Client" 
       contract="ServerWCF.ICotfServerWCF" name="BasicHttpBinding_ICotfServerWCF" > 
      </endpoint> 
     </client> 
    </system.serviceModel> 


</configuration> 

Я выяснил эту проблему после того, как я обновил свой сервер и клиент до нужных значений и правой привязки. Мой клиент по-прежнему отправляет конфигурацию по умолчанию. Кроме того, файл configuration.svcinfo по-прежнему находится в значении по умолчанию и не обновляется. Есть идеи?

ответ

0

Вы изменяете конфигурацию квот как на сервере, так и на стороне клиента.

+0

Да, я пробовал одинаковое значение как для сервера, так и для клиента, а также для разных значений. Тем не менее, он не работает. Значения i установлены выше 16384. Благодарим за помощь! – Sydnal

+0

Привет, я обновил свой вопрос, может снова взглянуть? благодаря! – Sydnal

0

Сначала вы уверены, что вы установили HttpRuntime более 4 МБ. Вы можете сделать это, как показано ниже:

<httpRuntime maxRequestLength="1572864"/> 

Этот элемент находится под элементом system.web. Среда выполнения http-платформы .NET не позволяет данным больше 4 МБ по умолчанию.

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

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

+0

Для миниатюры я подумал, что наконец-то есть ответ, к сожалению, он все еще не работает. Во всяком случае, исключение след шоу: "System.ServiceModel.ProtocolException, System.ServiceModel, Version = 4.0.0.0, культура = нейтральной, PublicKeyToken = b77a5c561934e089" сообщение: «Удаленный сервер возвратил неожиданный ответ: (400) Плохой запрос. Не очень полезно на самом деле. : \ – Sydnal

+0

Если вы развернете файл трассировки, вы должны найти причину плохого запроса. Также вы можете опубликовать свой Сервисный контракт и свой запрос, который будет отправлен. Попробуйте использовать скрипач, чтобы захватить ваш запрос. (Надеюсь, вы обновили конфигурацию клиента, чтобы иметь те же квитанции читателей, что и сервер) – Rajesh

+0

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

0

Клиент должен также получить behaviorConfiguration, который устанавливает maxItemsInObjectGraph

<system.serviceModel> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="ServiceBehavior"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 

Тогда .. ссылочный это новое поведение на клиентской конечной точке ...

<endpoint address="http://youraddresshere" 
      binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService" 
      contract="" name="" behaviorConfiguration="ServiceBehavior" /> 

Вы также можете попробовать увеличить значение maxBytesPerRead="" в настройках вашего клиента и службы.

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