WCF - Die maximale Zeichenzahl Nametable-Quote (16384) überschritten wurde, während XML-Daten lesen

StackOverflow https://stackoverflow.com/questions/2765598

Frage

Ich bin ein WCF-Dienst hat, die verwendet wsHttpBinding. Die Serverkonfiguration ist wie folgt:

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

Auf der Client-Seite Ich bin auch der Service-Referenz des WCF-Dienst. Es funktioniert großartig, wenn ich Funktionen haben nur begrenzte sagen 90 Bedienung Vertrag in meinem IService aber wenn fügen Sie ein mehr als Operation ich bin nicht in der Lage den Service Bezug auf Aktualisieren noch ich bin in der Lage diesen Dienst Verweis hinzuzufügen. In diesem Artikel ist erwähnt, dass durch jene Konfiguration zu ändern Dateien (dh devenv.exe.config, WcfTestClient.exe.config und SvcUtil.exe.config), es wird funktionieren diese Bindungen in den Konfigurationsdateien einschließlich noch aber auch das Fehlermeldung erscheint sagen

Es gab einen Fehler beim Herunterladen ‚ http://10.0.3.112/MyService/Service1.svc/ mex ‘. Fehler bei der Anforderung mit HTTP-Status 400: Bad Request. Metadaten enthält eine Referenz, die nicht gelöst werden können: ‚ http://10.0.3.112/MyService/Service1.svc / mex ‘. Es ist ein Fehler in XML-Dokument (1, 89549). Die maximale Zeichenzahl Nametable-Quote (16384) überschritten wurde, während XML-Daten zu lesen. Die Nametable ist eine Datenstruktur zum Speichern von Strings während der XML-Verarbeitung aufgetreten - lange XML-Dokumente mit nicht wiederholenden Elementnamen, Attributnamen und Attributwerten können diese Quote auslösen. Diese Quote kann durch Änderung der MaxNameTableCharCount Eigenschaft auf dem XmlDictionaryReaderQuotas erhöht werden verwendet, Objekt, wenn die XML-Leser zu schaffen. Zeile 1, Position 89549. Wenn der Dienst in der aktuellen Lösung definiert ist, versuchen Sie die Lösung des Aufbau und das Hinzufügen des Dienstverweises wieder.

Jede Idee, wie diese lösen ????

War es hilfreich?

Lösung

Versuchen Sie Folgendes:

Im Installationsverzeichnis von Visual Studio, wo devenv.exe befindet (zum Beispiel C: \ Programme \ Microsoft Visual Studio 9.0 \ Common7 \ IDE) fügen Sie diesen Abschnitt, um den 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>

in der app.config Ihrem WCF-Service fügen Sie die gleiche Bindung:

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

Beachten Sie, dass der Name Attribut der Bindungs ??Tags aus den beiden Dateien müssen übereinstimmen (z largeServiceBinding)

Schließlich fügen Sie den folgenden mex Endpunkt in Ihren Service-Tag:

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

Dies könnte wie folgt aussehen:

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

Andere Tipps

Ich weiß, es ist schon eine Weile, aber ich habe das gleiche Problem und fand andere (einfachere) Lösung in Codeproject

In der gegebenen Lösung gibt die Werte werden in dem Code statt der CONFIG-Datei festgelegt.

        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);

Allerdings änderte ich die Werte in den entsprechenden Werten in der .config-Datei (beide im <binding> und die <readerQuotas> Abschnitten) und löste das Problem (und nicht als individuelle Bindungen Hinzufügen):

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

Ich hoffe, dass dies helfen wird, jemand:)

Eine Sache, zu erkennen, dass die Nachricht an die svcutil Leser Quoten nicht die Service diejenigen bezieht sich! Svcutil hat eine Grenze, wie viel Metadaten lesen kann. Diese Grenze kann mit einer Konfigurationsdatei geändert werden. Die Lösung ist eine Konfigurationsdatei für svcutil erstellen und sie im selben Ordner wie das Werkzeug zu platzieren. Nächstes Mal, wenn svcutil ausführen, wird die Konfigurationsdatei Werte berücksichtigt werden.

http://geekswithblogs.net/claraoscura/archive/2007/ 20.08 / 114806.aspx

in Ihrem app.config oder dll.config auf das dem Client-add:

<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="myMex" maxReceivedMessageSize="1024000"> <!-- modify this to avoid stupid error -->
<readerQuotas maxNameTableCharCount="163840" /> <!-- DO NOT touch this one -->
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>

...

<client>
<endpoint binding="netTcpBinding" bindingConfiguration="myMex"
contract="IMetadataExchange" name="net.tcp" />

...

        </client>
    </system.serviceModel>
</configuration>

Und dort gehen Sie! Dies ist eine der wirklich ärgerlich Dinge mit WCF und Google so oft nur liefert Ihnen eine Menge bs. Vergeudet Tonnen Zeit mit diesem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top