从excel调用WCF服务会在收到的邮件大小上出错

时间:2014-05-07 09:21:56

标签: wcf excel-vba maxreceivedmessagesize moniker vba

我使用名字对象字符串从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位操作系统

2 个答案:

答案 0 :(得分:1)

你应该设置maxReceivedMessageSize =&#34; 2147483647&#34;增加邮件大小。

尝试增加邮件大小,如:

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

   </binding>

- OR

<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 Error "Maximum number of items that can be serialized or deserialized in an object graph is '65536'"

Wcf-The maximum message size quota for incoming messages (65536) has been exceeded?


<强>更新

您还可以以编程方式更改端点/服务行为。

参考链接:

How to: Specify a Service Binding in Code

How to: Programmatically Configure a WCF Endpoint


<强> UPDATE2:

对不起Anil,以前我完全忽视你在excel中这样做。

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

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

来源:

Using WCF in VB6

Integrating WCF Services with COM+

Communicate with WCF Windows Service in VB6?

希望它有所帮助。 :)

答案 1 :(得分:1)

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