2014-05-07 49 views
0

我正在使用名字符串從excel VBA代碼中調用我的WCF服務。然而,如我的服務返回大的數據作爲響應,EXCEL給出錯誤消息從excel調用WCF服務給出了接收到的郵件大小的錯誤

「最大消息大小配額用於傳入消息(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的教授,64位操作系統

+0

您使用moniker字符串而不僅僅是通常的ChannelFactory機制的具體原因是什麼? – 3dd

+0

節省額外的編碼工作 –

+1

請謹慎解釋,因爲您好像試圖解決這個問題,浪費編碼工作。如果你在客戶端使用ChannelFactory,你可以使用配置文件,並設置最大尺寸 – 3dd

回答

1

您應該設置maxReceivedMessageSize = 「2147483647」 增加消息的大小。

嘗試增加郵件大小等:

<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:

對不起阿尼爾,以前我完全忽略了你在Excel這樣做。

您的方案從VB6使用WCF服務的最簡單方法是爲服務客戶端創建.Net ComObject包裝器。然後在VB6中,你所做的只是一個創建對象,並在對象上調用一些方法。所有的WCF工作都發生在.Net com對象中。

只需在此項link中所述的單獨項目中創建WCF客戶端。註冊。NET程序集作爲一個類型庫,然後您將鏈接從VB6應用程序:link

來源:

Using WCF in VB6

Integrating WCF Services with COM+

Communicate with WCF Windows Service in VB6?

希望它能幫助。 :)

+0

Pranav - 我改變了你提到的大小,仍然給出同樣的錯誤。這篇文章說,它應該在客戶端以及服務器端進行更改。我如何在客戶端進行更改,這在我的情況下非常出色? –

+0

您也可以通過編程方式更改端點/服務行爲。我正在更新答案。 –

+0

Pranav - 我使用Excel作爲我的客戶端,它具有VB6作爲代碼。這些鏈接討論vb.net版本,並且該代碼不能在vb6中工作,我相信。 –

1

最大尺寸必須由客戶端以及服務器來設置。但是,您使用的服務名稱表單不支持指定此參數。 從我能告訴你的第一手經驗來看,開始時使用標記可能看起來很吸引人,因爲它允許你使用VBA調用服務,只需最少的編碼,但它的功能非常有限。我發現,毫無疑問,你也處於dicovering的過程中,解決這個問題的最好方法是構建一個合適的WCF客戶端 - 可能是.NET--並從VBA甚至Excel直接調用客戶端類。 如果您正在嘗試此操作並仍然遇到問題,請啓動一個新線程,以便您可以發佈代碼,並更全面地解釋您嘗試過的內容以及問題所在。

相關問題