1

Я создал простой веб-службы WCF, который имеет один метод: SubmitTicket (flightticket футов, строка пользователя, строка пароля)Отправка объекта службе WCF. MaxStringContentLength (8192 байт) превышено при десериализации

На стороне клиента, у меня есть приложение для оформив (билет полета) и отправив его на этот вновь созданный веб-сервис. Когда этот объект flyticket превышает 8192 байта, я получаю следующую ошибку:

«Ошибка десериализации объекта типа flyticket. Максимальная длина длины строки содержимого (8192) была превышена при чтении данных XML. Эта квота может быть увеличена путем изменения свойства MaxStringContentLength объекта XmlDictionaryReaderQuotas, используемого при создании XML-считывателя. «

Я провел некоторое исследование в Интернете и обнаружил, что мне нужно установить MaxStringContentLength в файле web.config (server) и app.config (client), чтобы большее число. Проблема в том, что я пробовал каждую возможную комбинацию настроек в обоих файлах конфигурации из чтения различных блогов и сайтов, но это STILL не срабатывает по той же ошибке!

Я приложил свой код конфигурации клиента и сервера (так как на данный момент он прошел множество многих изменений в течение дня без успеха).

Одна вещь, которую я заметил, это то, что файл configuration.svcinfo в моем клиентском приложении всегда показывает 8192 для MaxStringContentLength, когда я обновляю ссылку на службу. Кажется, он принимает все значения по умолчанию, даже если я явно задал свойства привязки. Не уверен, что это связано с моей проблемой вообще, но стоит упомянуть.


Здесь применяется app.config/web.config код для определения конечной точки привязки:

< < < < < КЛИЕНТ >>>>>

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<configSections> 
</configSections> 
<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_IFlightTicketWebService" 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="65536" maxArrayLength="16384" 
        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://xx.xx.xx/xxxxxxxx.svc" 
      binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IFlightTicketWebService" 
      contract="FlightTicketWebService.IFlightTicketWebService" 
      name="BasicHttpBinding_IFlightTicketWebService" /> 
    </client> 
</system.serviceModel> 
</configuration> 

< < < < < СЕРВЕР >>>>>

<?xml version="1.0"?> 
<configuration> 
<configSections> 
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
    <section name="GSH.FlightTicketWebService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
</sectionGroup> 
</configSections> 
<system.web> 
<httpRuntime maxRequestLength="16384"/> 
<compilation debug="true" targetFramework="4.0"/> 
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/> 
</system.web> 

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_IFlightTicketWebService" 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="65536" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <security mode="None"> 
        <transport clientCredentialType="None" proxyCredentialType="None" 
         realm="" /> 
        <message clientCredentialType="UserName" algorithmSuite="Default" /> 
       </security> 
      </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="true"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 
<services> 
    <service name="FlightTicketWebService"> 
     <endpoint 
      name="FlightTicketWebServiceBinding" 
      address="http://xx.xx.xx/xxxxxxxxxxx.svc" 
      binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_IFlightTicketWebService" 
      contract="IFlightTicketWebService"/> 
    </service> 
</services> 
</system.serviceModel> 
<system.webServer> 

ответ

4

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

По сути, это является побочным продуктом WCF функциональности конечной точки 4 по умолчанию, что, если он не находит соответствий конфига он помещает конечные точки с настройками по умолчанию

+2

мне удалось выяснить проблему - я просто вынул имя связывания на конфигурации сервера (<связывание Name = «BasicHttpBinding_IFlightTicketWebService» - вынул собственность имени), а затем в конфигурации секции конечной точки я удалил имя привязки, чтобы он просто указал binding = "basicHttpBinding" и все. Я действительно не понимаю, почему мое решение сработало. По какой-то причине он, казалось, игнорировал мое привязку, когда я указал имя используемой привязки. Прямо сейчас кажется, что maxStringContentLength теперь является опцией по умолчанию для любого basicHttpBinding, что отлично и решает мою проблему. – deadcom

+0

У меня все еще есть имя службы, указанное как FlightTicketWebService, которое работает, несмотря на то, что оно не является полностью квалифицированным. – deadcom

+0

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

1

Это ответ! Я искал всюду решение этой проблемы в WCF 4.0, и эта запись Ричарда Блветта была последней частью головоломки.

Основные вещи, извлеченные из моих исследований:

  • если исключение на службе, то только изменить Web сервера.файл конфигурации; не беспокойтесь о клиенте
  • создать пользовательские BasicHttpBinding:
<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="customBindingNameForLargeMessages"> 
  • добавить большие readerQuota значения (наибольшее возможное, показанные здесь, настроить по вкусу)
 <binding name="customBindingNameForLargeMessages" 
      maxReceivedMessageSize="2147483647"> 
      <readerQuotas maxDepth="2147483647" 
      maxStringContentLength="2147483647" 
      maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" 
      maxNameTableCharCount="2147483647" /> 
     </binding> 
    </basicHttpBinding> 
</bindings> 
  • создать сервис ent ry, с конечной точкой, которая сопоставляется с таможней переплет. Отображение происходит, когда конечная точка bindingConfiguration такого же, как связывающие года имени:
  • Убедитесь, что имя службы и стоимость контракта полностью квалифицированы - использовать пространство имен и имя класса.
<system.serviceModel> 
    <services> 
     <service name="Namespace.ServiceClassName"> 
      <endpoint 
       address="http://urlOfYourService" 
       bindingConfiguration="customBindingNameForLargeMessages"      
       contract="Namespace.ServiceInterfaceName" 
       binding="basicHttpBinding" 
       name="BasicHTTPEndpoint" /> 
     </service> 
    </services> 

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

  • Нет связанных вопросов^_^