При вызове службы WCF из Excel выдается ошибка в размере полученного сообщения.

Я звоню в службу WCF из кода Excel VBA, используя строку с именами. Однако, поскольку мой сервис возвращает большие данные в качестве ответа, Excel выдает сообщение об ошибке

"Превышена квота максимального размера сообщения для входящих сообщений (65534). Для увеличения квоты используется свойство MaxReceivedMessageSize для соответствующего элемента привязки"

Вот строка с прозвищем:

addrToService = "service4:mexAddress=""net.tcp://localhost/MyApp/API/Excel/ExcelAPIService.svc/mexTCP"", "
addrToService = addrToService + "address=""net.tcp://localhost/PruCapWebCMHost/API/Excel/ExcelAPIService.svc"", "
addrToService = addrToService + "contract=""IExcelAPIService"", contractNamespace=""http://Prucap/Services"", "
addrToService = addrToService + "binding=""NetTcpBinding_IExcelAPIService"", bindingNamespace=""http://MyApp/Services"""

Чтобы решить эту проблему, я увеличил размер файла web.config моей службы WCF, как показано ниже:

<netTcpBinding>
    <binding name="NetTcpBinding_IPublicService" maxBufferPoolSize="8388608"  maxBufferSize="8388608" maxReceivedMessageSize="8388608" portSharingEnabled="true">
    </binding>
</netTcpBinding>

<basicHttpBinding>
    <binding name="BasicHttpBidning_IPublicService" closeTimeout="00:05:00" openTimeout="00:05:00" sendTimeout="00:05:00" receiveTimeout="00:05:00" maxReceivedMessageSize="8388608" />
    <binding name="BasicHttpBidning_ISecureService" closeTimeout="00:05:00" openTimeout="00:05:00" sendTimeout="00:05:00" receiveTimeout="00:05:00" maxReceivedMessageSize="8388608" />
</basicHttpBinding>

....

  <service name="ExcelAPIService" behaviorConfiguration="PublicServiceTypeBehaviors">
    <endpoint address="" bindingNamespace="http://MyApp/Services" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IPublicService" contract="API.Service.ExcelAPI.IExcelAPIService" name="NetTcpBinding_IExcelAPIService" />
    <endpoint address="" bindingNamespace="http://MyApp/Services" binding="basicHttpBinding" bindingConfiguration="BasicHttpBidning_IPublicService" contract="API.Service.ExcelAPI.IExcelAPIService" name="BasicHttpBidning_IExcelAPIService" />
    <endpoint address="mex" bindingNamespace="http://MyApp/Services" binding="mexHttpBinding" contract="IMetadataExchange" />
    <endpoint address="mexTCP" bindingNamespace="http://MyApp/Services" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />
  </service>

Согласно различным форумам на эту тему, вышеуказанное решение должно работать. Но это не работает в моем случае, когда вызывается из Excel. Что мне нужно сделать со стороны excel, чтобы установить maxReceivedMessageSize? Если да, то как я могу это сделать, используя код VBA?

Дополнительная информация:

Я использую Office 2010 (с VBA), Windows 7 Prof, 64-битная ОС

2 ответа

Вы должны установить maxReceivedMessageSize="2147483647", чтобы увеличить размер сообщения.

Попробуйте увеличить размер сообщения, например:

 <binding maxBufferSize="2147483647" 
             maxBufferPoolSize="2147483647" 
             maxReceivedMessageSize="2147483647">
        <readerQuotas maxDepth="2147483647" 
                      maxStringContentLength="2147483647" 
                      maxArrayLength="2147483647" 
                      maxBytesPerRead="2147483647"
                      maxNameTableCharCount="2147483647" />

   </binding>

--ИЛИ ЖЕ

<basicHttpBinding>
      <binding name="BasicHttpBinding_IManagementService" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
        maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
        useDefaultWebProxy="true">
        <readerQuotas maxDepth="128" maxStringContentLength="2147483647"
          maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        <security mode="None">
          <transport clientCredentialType="None" proxyCredentialType="None"
            realm="" />
          <message clientCredentialType="UserName" algorithmSuite="Default" />
        </security>
      </binding>
    </basicHttpBinding>

см. ошибку WCF "Максимальное количество элементов, которые можно сериализовать или десериализовать в графе объектов, равно 65536".

Wcf-Превышен ли максимальный размер квоты для входящих сообщений (65536)?


ОБНОВИТЬ

Вы также можете изменить поведение конечной точки / службы программно.

Ссылки по ссылке:

Как: указать привязку службы в коде

Как: программно настроить конечную точку WCF


Update2:

Извините, Анил, ранее я полностью забыл, что вы делаете это в Excel.

В вашем сценарии проще всего использовать службу WCF из VB6 - создать оболочку.Net ComObject для клиента службы. Затем в VB6 все, что вы делаете - это создаете объект и вызываете некоторые методы для этого объекта. Вся работа WCF происходит в объекте.Net com.

Просто создайте клиент WCF для службы в отдельном проекте, как описано в этой ссылке. Зарегистрируйте сборку.NET как библиотеку типов, на которую вы затем будете ссылаться из приложения VB6: ссылка.

Источники:

Использование WCF в VB6

Интеграция сервисов WCF с COM+

Общаться с WCF Windows Service в VB6?

Надеюсь, поможет.:)

Максимальный размер должен быть установлен как клиентом, так и сервером. Однако используемая вами форма названия службы не поддерживает указание этого параметра. Исходя из личного опыта, я могу вам сказать, что использование прозвищ на первый взгляд может показаться привлекательным, поскольку оно позволяет вам вызывать сервисы из VBA с минимальным кодированием, но оно очень ограничено в своих возможностях. Я обнаружил, что, несомненно, вы также находитесь в процессе наложения, лучший способ подойти к этому - создать правильный клиент WCF - возможно, в.NET - и вызвать клиентский класс из вашего VBA или даже из Excel напрямую. Если вы пытаетесь это сделать, но у вас все еще есть проблемы, пожалуйста, создайте новую ветку, чтобы вы могли опубликовать свой код и более подробно объяснить, что вы пробовали и в чем проблема.

Другие вопросы по тегам