Подтвердить что ты не робот

Максимальная квота длины массива

Я пишу небольшое приложение WCF/WPF для изменения размеров изображений, но WCF приносит мне печаль, когда я пытаюсь отправить изображение размера 28K на мой сервис от клиента. Сервис отлично работает, когда я отправляю ему меньшие изображения. Я сразу же предположил, что это проблема конфигурации, и я тратил веб-страницы на сообщения о свойстве MaxArrayLength в моей конфигурации привязки. Ive увеличил ограничения на эти настройки как на клиенте, так и на сервере до 2147483647, но все же я получаю следующую ошибку:

Форматирующий оператор выдал исключение при попытке десериализации сообщения: при попытке десериализации произошла ошибка параметр http://mywebsite.com/services/servicecontracts/2009/01:OriginalImage. Сообщение InnerException было "Ошибка десериализации объекта типа System.Drawing.Image. Максимальная длина длины массива (16384) была превышена при чтении XML-данных. Эта квота может быть увеличена путем изменения свойства MaxArrayLength на объекте XmlDictionaryReaderQuotas, используемом при создании XML-ридера. '. Дополнительную информацию см. В InnerException.

Я сделал настройки моего клиента и сервера одинаковыми, и они выглядят следующим образом: Сервер:

<system.serviceModel>
    <bindings>
        <netTcpBinding>
            <binding name="NetTcpBinding_ImageResizerServiceContract" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10"
                maxReceivedMessageSize="2147483647">
                <readerQuotas maxDepth="32"
                              maxStringContentLength="2147483647"
                              maxArrayLength="2147483647"
                              maxBytesPerRead="2147483647"
                              maxNameTableCharCount="2147483647" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
                <security mode="Transport">
                    <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                    <message clientCredentialType="Windows" />
                </security>
            </binding>
        </netTcpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service name="LogoResizer.WCF.ServiceTypes.ImageResizerService" behaviorConfiguration="ServiceBehavior">
            <host>
                <baseAddresses>
                    <add baseAddress="http://localhost:900/mex/"/>
                    <add baseAddress="net.tcp://localhost:9000/" />
                </baseAddresses>
            </host>
            <endpoint binding="netTcpBinding" contract="LogoResizer.WCF.ServiceContracts.IImageResizerService" />
            <endpoint  address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
</system.serviceModel>

и моя конфигурация клиента выглядит так:

 <system.serviceModel>
    <bindings>
        <netTcpBinding>
            <binding name="NetTcpBinding_ImageResizerServiceContract" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10"
                maxReceivedMessageSize="2147483647">
                <readerQuotas maxDepth="32" 
                              maxStringContentLength="2147483647"
                              maxArrayLength="2147483647" 
                              maxBytesPerRead="2147483647" 
                              maxNameTableCharCount="2147483647" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
                <security mode="Transport">
                    <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                    <message clientCredentialType="Windows" />
                </security>
            </binding>
        </netTcpBinding>
    </bindings>
    <client>
        <endpoint address="net.tcp://localhost:9000/" binding="netTcpBinding"
            bindingConfiguration="NetTcpBinding_ImageResizerServiceContract"
            contract="ImageResizerService.ImageResizerServiceContract"
            name="NetTcpBinding_ImageResizerServiceContract">
            <identity>
                <userPrincipalName value="[email protected]" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

Кажется, что независимо от того, что я установил эти значения, я все равно получаю сообщение об ошибке: wcf не может сериализовать мой файл, потому что он больше 16384. Любые идеи?

Обновление: адрес электронной почты в теге userPrincipalName был изменен для моей конфиденциальности

4b9b3361

Ответ 1

My Bad - я забыл применить мою привязку к моей конечной точке в моей конфигурации на стороне сервера. Конфигурация сервера должна читать:

<system.serviceModel>
    <bindings>
        <netTcpBinding>
            <binding name="NetTcpBinding_ImageResizerServiceContract" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10"
                maxReceivedMessageSize="2147483647">
                <readerQuotas maxDepth="2147483647"
                              maxStringContentLength="2147483647"
                              maxArrayLength="2147483647"
                              maxBytesPerRead="2147483647"
                              maxNameTableCharCount="2147483647" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
                <security mode="Transport">
                    <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                    <message clientCredentialType="Windows" />
                </security>
            </binding>

        </netTcpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service name="LogoResizer.WCF.ServiceTypes.ImageResizerService" behaviorConfiguration="ServiceBehavior">
            <host>
                <baseAddresses>
                    <add baseAddress="http://localhost:900/mex/"/>
                    <add baseAddress="net.tcp://localhost:9000/" />
                </baseAddresses>
            </host>
            <endpoint bindingConfiguration="NetTcpBinding_ImageResizerServiceContract" binding="netTcpBinding" contract="LogoResizer.WCF.ServiceContracts.IImageResizerService" />
            <endpoint  address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
</system.serviceModel>

Обратите внимание, что привязкаConfiguration = "NetTcpBinding_ImageResizerServiceContract" добавлена ​​в конечную точку netTcp. Теперь мое приложение работает с большими изображениями. Сладкое.

Ответ 2

Добавьте привязку <readerQuotas>.

Это основная проблема при загрузке и загрузке байта [], она решила мою проблему.

<basicHttpBinding>
    <binding name="ServicesBinding" transferMode="Streamed" maxBufferSize="200000000"
        maxReceivedMessageSize="200000000" messageEncoding="Text"  
        receiveTimeout="00:10:00">
        <readerQuotas maxDepth="2147483647"
            maxStringContentLength="2147483647"
            maxArrayLength="2147483647"
            maxBytesPerRead="2147483647"
            maxNameTableCharCount="2147483647" />
    </binding>
</basicHttpBinding>

Ответ 3

Я использовал Microsoft SDK SvcConfigEditor. У вас это есть, если вы используете Visual Studio (у которого есть своя версия). Это также бесплатная загрузка.

На вашем жестком диске (проверьте как программные файлы, так и программные файлы (x86)):

C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin\NETFX 4.0 Инструменты \SvcConfigEditor.exe

C:\Program Files\Microsoft SDK\Windows\v7.1\Bin\NETFX 4.0 Инструменты \SvcConfigEditor.exe

Если у вас несколько установок Microsoft SDK, какая версия, которую вы используете, будет зависеть от того, какую версию .NET вы разрабатываете. Инструмент выдаст ошибку, чтобы сообщить вам, что вы пытались открыть файл .dll в неправильной версии.

Чтобы использовать инструмент, укажите на ваш файл .dll services и дайте инструменту тяжелый подъем. Это особенно полезно, если у вас есть услуги, связанные с услугами (службами прокси). Кроме того, имейте в виду, что вам, вероятно, потребуется настройка конфигурации для вашего клиента (в приложении) и конфигураций сервера (в веб-службе).

Мне не хватало конфигурации на конечной точке на стороне сервера. Я должен был сделать две вещи:

  • Поместите конечную точку в мою конфигурацию на стороне сервера, настроенную с помощью SvcConfigEditor
  • Не забудьте установить MaxArrayLength в инструменте SvcConfigEditor

Кроме того, ASP.NET придирчиво относится к этому значению, поэтому вы можете попытаться упростить привязку конфигурации и отключить ее:

  <serviceHostingEnvironment multipleSiteBindingsEnabled="false" />

Ответ 4

он работает, ранее показывал ссылку net.tcp://myservice.com/Ac_Service.svc/mex при просмотре службы wcf, но теперь он http://myservice.com/Ac_Service.svc?wsdl

он будет работать и в будущем, без каких-либо проблем.