9

wsHttpBinding を使用する WCF サービスを使用しています。サーバー構成は次のとおりです。

<bindings>
      <wsHttpBinding>
        <binding name="wsHttpBinding" maxBufferPoolSize="2147483647"
          maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <security mode="None">
            <transport clientCredentialType="Windows" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
              algorithmSuite="Default" establishSecurityContext="true" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

クライアント側では、WCF サービスのサービス参照を含めています。IService で 90 の Operation Contract などの機能が制限されている場合はうまく機能しますが、もう 1 つ OperationContract を追加すると、サービス参照を更新することも、そのサービス参照を追加することもできなくなります。この記事ではこれらの構成ファイル (つまり、devenv.exe.config、WcfTestClient.exe.config、および SvcUtil.exe.config) を変更することで機能することが言及されていますが、これらの構成ファイルにこれらのバインディングを含めても、それでもエラーがポップアップ表示されます

「 http://10.0.3.112/MyService/Service1.svc/mex 」のダウンロード中にエラーが発生しました。リクエストは HTTP ステータス 400: Bad Request で失敗しました。メタデータに解決できない参照が含まれています: ' http://10.0.3.112/MyService/Service1.svc/mex'。XML ドキュメントにエラーがあります (1, 89549)。XML データの読み取り中に、nametable の最大文字数クォータ (16384) を超えました。nametable は、XML 処理中に検出された文字列を格納するために使用されるデータ構造です。要素名、属性名、および属性値が繰り返されない長い XML ドキュメントは、このクォータをトリガーする可能性があります。このクォータは、XML リーダーの作成時に使用される XmlDictionaryReaderQuotas オブジェクトの MaxNameTableCharCount プロパティを変更することによって増やすことができます。行 1、位置 89549。サービスが現在のソリューションで定義されている場合は、ソリューションを構築して、サービス参照を再度追加してみてください。

これを解決する方法はありますか????

4

4 に答える 4

12

次のことを試してください。

devenv.exe がある Visual Studio のインストール ディレクトリ (例: C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE) で、このセクションを devenv.exe.cofig に追加します。

<system.serviceModel>
<client>
  <endpoint binding="customBinding" bindingConfiguration="largeServiceBinding" contract="IMetadataExchange" name="http" />
</client>

<bindings>
  <customBinding>
    <!-- NOTE: The binding name must be the same as specified in the config file of the wcf service -->
    <binding name="largeServiceBinding" >
      <textMessageEncoding>
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      </textMessageEncoding>

      <httpTransport transferMode="Buffered" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"/>
    </binding>

  </customBinding>
</bindings>
</system.serviceModel>

WCF サービスの app.config で、同じバインディングを追加します。

<bindings>
  <customBinding >
    <!-- NOTE: The binding name must be the same as specified in the devenv.exe.config file located ..\Common7\IDE folder of the VS installation directory -->
    <binding name="largeServiceBinding" >
      <textMessageEncoding>
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647"
          maxNameTableCharCount="2147483647" />
      </textMessageEncoding>
      <httpTransport transferMode="Buffered" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"/>
    </binding>
  </customBinding>
</bindings>

2 つのファイルのバインディング タグの name 属性が一致する必要があることに注意してください(例: largeServiceBinding)。

最後に、次の mex エンドポイントをサービス タグに追加します。

 <endpoint address="mex" binding="customBinding" contract="IMetadataExchange" bindingName="testBinding" bindingConfiguration="largeServiceBinding" name="http"/>

これは次のようになります。

 <services>
  <service behaviorConfiguration="MyServiceBehavior"
    name="MyService.MyService">
    <endpoint address="" binding="wsHttpBinding" contract="MyService.IMyService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="customBinding" contract="IMetadataExchange" bindingName="testBinding" bindingConfiguration="largeServiceBinding" name="http"/>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8731/Design_Time_Addresses/MyService/MyService/" />
      </baseAddresses>
    </host>
  </service>
</services>
于 2010-05-04T15:59:01.163 に答える
5

しばらく経っていることは知っていますが、同じ問題が発生し 、codeproject で他の (より単純な) 解決策を見つけました

そこにあるソリューションでは、値は .config ファイルではなくコードで設定されます。

        BasicHttpBinding binding = new BasicHttpBinding();
        binding.Security.Mode = BasicHttpSecurityMode.Transport;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
        binding.MaxReceivedMessageSize = 50000000;
        binding.ReaderQuotas.MaxArrayLength = 50000000;
        binding.ReaderQuotas.MaxStringContentLength = 50000000;
        binding.ReaderQuotas.MaxNameTableCharCount = 50000000;
        EndpointAddress endpoint = new EndpointAddress(new Uri("https://server/EWS/Exchange.asmx"));
        ExchangeServicePortTypeClient ews = new ExchangeServicePortTypeClient(binding, endpoint);

ただし、.config ファイルの関連する値の値を変更し (セクション<binding><readerQuotas>セクションの両方で)、問題を解決しました (カスタム バインディングを追加するのではなく)。

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

これが誰かに役立つことを願っています:)

于 2011-11-14T15:57:53.457 に答える
1

注意すべきことの 1 つは、メッセージがサービスではなく svcutil リーダー クォータを参照していることです。Svcutil には、読み取れるメタデータの量に制限があります。この制限は、構成ファイルで変更できます。解決策は、svcutil の構成ファイルを作成し、ツールと同じフォルダーに配置することです。次回 svcutil を実行すると、構成ファイルの値が考慮されます。

http://geekswithblogs.net/claraoscura/archive/2007/08/20/114806.aspx

于 2011-05-24T05:24:21.740 に答える