ошибка при попытке отправить файл в wcf - PullRequest
0 голосов
/ 08 июля 2011

при попытке отправить файл с помощью службы WCF я получаю это исключение

Форматировщик выдал исключение, пока пытаясь десериализовать сообщение: Ошибка в десериализации тела запроса сообщение для операции «Send_File». Максимальная квота длины массива (16384) имеет был превышен при чтении данных XML. Эта квота может быть увеличена на изменение свойства MaxArrayLength на XmlDictionaryReaderQuotas объект, используемый при создании XML читатель.

Я сначала преобразовал файл в массив байтов, прежде чем отправил его это клиентская конфигурация, которая отправила файл

<system.serviceModel>
<bindings>
  <netTcpBinding>
    <binding name="TcpBinding" closeTimeout="10:00:00" openTimeout="10:00:00"
        receiveTimeout="10:00:00" sendTimeout="10:00:00" transactionFlow="false"
        transferMode="Buffered" transactionProtocol="OleTransactions"
        hostNameComparisonMode="StrongWildcard" listenBacklog="10"
        maxBufferPoolSize="10000000" maxBufferSize="10000000" maxConnections="30"
        maxReceivedMessageSize="10000000">
      <readerQuotas maxDepth="64" maxStringContentLength="10000000" maxArrayLength="100000000"
          maxBytesPerRead="10000000" maxNameTableCharCount="10000000" />
      <reliableSession ordered="true" inactivityTimeout="10:00:00"
          enabled="false" />
    </binding>
  </netTcpBinding>
  <wsDualHttpBinding>
    <binding name="HttpBinding" closeTimeout="10:00:00" openTimeout="10:00:00"
        receiveTimeout="10:00:00" sendTimeout="10:00:00" bypassProxyOnLocal="false"
        transactionFlow="false" hostNameComparisonMode="StrongWildcard"
        maxBufferPoolSize="10000000" maxReceivedMessageSize="10000000"
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="10000000" maxArrayLength="10000000"
          maxBytesPerRead="10000000" maxNameTableCharCount="10000000" />
      <reliableSession ordered="true" inactivityTimeout="10:00:00" />
    </binding>
  </wsDualHttpBinding>
</bindings>
<behaviors>
  <endpointBehaviors>
    <behavior name="filebehavior">
      <dataContractSerializer maxItemsInObjectGraph="2000000000"/>
    </behavior>
  </endpointBehaviors>
</behaviors>
<client>
  <endpoint address="net.tcp://localhost:8000/ChatRoom/service" behaviorConfiguration="filebehavior"
      binding="netTcpBinding" bindingConfiguration="TcpBinding"
      contract="ChatRoom" name="TcpBinding">
    <identity>
      <servicePrincipalName value="my_machine\ASPNET" />
    </identity>
  </endpoint>
  <endpoint address="http://localhost:8001/ChatRoom/service" binding="wsDualHttpBinding"
      bindingConfiguration="HttpBinding" contract="ChatRoom" name="HttpBinding">
    <identity>
      <servicePrincipalName value="my_machine\ASPNET" />
    </identity>
  </endpoint>
</client>

настройка сервера

<system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="securingWSHttpBinding">
        </binding>
        <binding name="wsHttpBinding_ChatRoomServices" maxReceivedMessageSize="10000000" />
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceTimeouts transactionTimeout="10:00:00"/>
          <serviceMetadata httpGetEnabled="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
        <services>
      <service name="ChatRoomService.ChatRoom"
               behaviorConfiguration="ServiceBehavior">
        <endpoint address="service" binding="netTcpBinding" contract="ChatRoomService.IChatRoom" name="TcpBinding"/>
        <endpoint address="service" binding="wsDualHttpBinding" contract="ChatRoomService.IChatRoom" name="HttpBinding"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" name="MexBinding"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8000/ChatRoom/"/>
            <add baseAddress="http://localhost:8001/ChatRoom/"/>
          </baseAddresses>
        </host>
      </service>
        </services>
    </system.serviceModel>

как я могу решить это исключение?

Ответы [ 3 ]

1 голос
/ 08 июля 2011

Добавьте это при указании поведения службы и поведения конечной точки

на стороне клиента, при указании конечной точки задайте имя поведения:

<endpoint behaviorConfiguration = "myBehavior"/>

, а затем укажите это поведение:

<behaviours>
    <endpointBehaviors>
        <behavior name="myBehavior">
            <dataContractSerializer maxItemsInObjectGraph="a number that is big enough"/>
        </behavior>
    </endpointBehaviors>
</behaviors>

на сервере:

когда вы указываете 'service' и 'endpoint', присоедините соответственно serviceBehavior и endpointBehavior, как для клиента.

0 голосов
/ 08 июля 2011

Во-первых, ваши привязки даже не совпадают между клиентом и сервером:)

У вашего клиента есть NetTcpBinding и DualWsHttpBinding, а на вашем сервере есть wsHttpBinding.Я удивлен, что они могут даже общаться друг с другом, если честно.(Если только вы не используете WCF 4.0, в этом случае у вас будут привязки и конечные точки по умолчанию).

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

Конфигурация клиента выглядит нормально, попробуйте это для сервера (я только включаю протокол NetTcpBinding и добавляю поведениеName иПривязка атрибутов конфигурации к конечной точке - остальные привязки будут аналогичными):

<system.serviceModel>
  <bindings>
    <netTcpBinding>
      <binding name="TcpBinding" closeTimeout="10:00:00" openTimeout="10:00:00" receiveTimeout="10:00:00" sendTimeout="10:00:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="10000000" maxBufferSize="10000000" maxConnections="30" maxReceivedMessageSize="10000000">
        <readerQuotas maxDepth="64" maxStringContentLength="10000000" maxArrayLength="100000000" maxBytesPerRead="10000000" maxNameTableCharCount="10000000" />       
        <reliableSession ordered="true" inactivityTimeout="10:00:00" enabled="false" />     
      </binding>
    </netTcpBinding>
  </bindings> 
  <behaviors>
    <endpointBehaviors>
      <behavior name="filebehavior">       
        <dataContractSerializer maxItemsInObjectGraph="2000000000"/>     
      </behavior>
    </endpointBehaviors> 
  </behaviors> 
  <service>
    <endpoint address="net.tcp://localhost:8000/ChatRoom/service" behaviorConfiguration="filebehavior" binding="netTcpBinding" bindingConfiguration="TcpBinding" contract="ChatRoom" name="TcpBinding">
      <identity>
        <servicePrincipalName value="my_machine\ASPNET" />
      </identity>
    </endpoint>    
  </service>
</system.serviceModel>
0 голосов
/ 08 июля 2011

вы можете попробовать режим потоковой передачи в вашем случае. http://msdn.microsoft.com/en-us/library/ms789010.aspx

...