0

我正在使用名字对象字符串从 excel VBA 代码调用我的 WCF 服务。但是,当我的服务返回大数据作为响应时,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"""

为了解决这个问题,我增加了 WCF 服务的 web.config 文件的大小,如下所示:

<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 位操作系统

4

2 回答 2

1

您应该设置 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 终结点


更新2:

对不起,阿尼尔,以前我完全忽略了你在 excel 中这样做。

您的场景使用 VB6 中的 WCF 服务的最简单方法是为服务客户端创建一个 .Net ComObject 包装器。然后在 VB6 中,您所做的只是创建对象并在对象上调用一些方法。所有 WCF 工作都在 .Net com 对象中进行。

只需按照此链接中的说明在单独的项目中为服务创建 WCF 客户端。将 .NET 程序集注册为类型库,然后您将从 VB6 应用程序链接它:link

资料来源:

在 VB6 中使用 WCF

将 WCF 服务与 COM+ 集成

在 VB6 中与 WCF Windows 服务通信?

希望能帮助到你。:)

于 2014-05-07T09:55:05.767 回答
1

最大大小必须由客户端和服务器设置。但是,您使用的服务名字对象表单不支持指定此参数。根据第一手经验,我可以告诉你,使用名字一开始可能看起来很吸引人,因为它允许你以最少的编码从 VBA 调用服务,但它的功能非常有限。我发现,毫无疑问,您也在探索过程中,解决此问题的最佳方法是构建一个适当的 WCF 客户端 - 可能在 .NET 中 - 并从您的 VBA 甚至直接在 Excel 中调用客户端类。如果您正在尝试并且仍然遇到问题,请启动一个新线程,以便您可以发布您的代码,并更全面地解释您尝试过的内容以及问题所在。

于 2014-06-10T20:58:20.647 回答