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から呼び出された場合、これは機能しません。maxReceivedMessageSize を設定するために Excel 側から行う必要があることはありますか? はいの場合、VBAコードを使用してこれを行うにはどうすればよいですか?

追加情報:

Office 2010 (VBA を使用)、Windows 7 Prof、64 ビット OS を使用しています

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 に答える