2013-08-14 10 views
5

Ich habe gerade die Anzahl der Methoden in meinem ServiceContract erhöht. wenn ich den Service Referenz in Visual Studio aktualisieren erhalte ich die Meldung:Die Höchstzahl der Zeichenzählung für Namenszeichen (16384) wurde überschritten

Metadaten eine Referenz enthält, die nicht aufgelöst werden kann: 'net.tcp: //xxxxx.com: 8002/DataQueryService/mex'.

Im XML-Dokument ist ein Fehler aufgetreten.

Das maximale Namenszeichen count quota (16384) wurde beim Lesen von XML-Daten überschritten. Die Nametable ist eine Datenstruktur, die zum Speichern von Strings verwendet wird, die während XML-Verarbeitung angetroffen werden - lange XML-Dokumente mit sich nicht wiederholenden Elementnamen, Attributnamen und Attributwerte können dieses Kontingent auslösen. Dieses -Kontingent kann erhöht werden, indem die MaxNameTableCharCount-Eigenschaft für das XmlDictionaryReaderQuotas-Objekt geändert wird, das beim Erstellen des XML-Lesers verwendet wird.

Der ursprüngliche Server-Seite Config war:

<services> 
     <service behaviorConfiguration="XXXXX.DataQueryService.ServiceBehavior" name="XXXXX.DataQueryService.QueryService"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://xxxxx.com:8002/DataQueryService" /> 
      </baseAddresses> 
     </host> 
     <endpoint name="MexEndpoint" address="mex" binding="customBinding" bindingConfiguration="unsecureTcpMex" contract="IMetadataExchange" /> 
    </service> 
</services> 

<bindings> 
    <customBinding> 
     <binding name="unsecureTcpMex"> 
      <tcpTransport portSharingEnabled="True" /> 
     </binding> 
    </customBinding>  
</bindings> 

, die ich geändert:

<bindings> 
    <customBinding> 
     <binding name="unsecureTcpMex"> 
      <textMessageEncoding> 
       <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
      </textMessageEncoding> 
      <tcpTransport portSharingEnabled="True" maxReceivedMessageSize="2147483647" /> 
     </binding> 
    </customBinding>  
</bindings> 

Welche anderen Änderungen muss ich an meine Config machen diese Arbeit zu bekommen?

Update Nach @ Chris Ratschlag habe ich versucht, die Konfigurationsdatei für SVCUtil zu aktualisieren. Ich habe meinem Endpunkt einen Namen hinzugefügt, damit er übereinstimmt (oben aktualisiert). Die SvcUtil.config ist nun wie folgt:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <customBinding> 
       <binding name="unsecureTcpMex"> 
        <textMessageEncoding> 
         <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
        </textMessageEncoding> 
        <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /> 
       </binding> 
      </customBinding> 
     </bindings> 
     <client> 
      <endpoint binding="customBinding" bindingConfiguration="unsecureTcpMex" 
       contract="IMetadataExchange" 
       name="MexEndpoint" /> 
     </client> 
    </system.serviceModel> 
</configuration> 
+0

Vielleicht Ihre Nachrichten sind einfach zu groß oder zu viele XML-Elemente/Attribute zusammengesetzt? –

+0

Es ist die Anzahl der Betriebsverträge, die zugenommen hat. Dies verursacht das Problem. – openshac

+0

Mit welcher Version von WCF arbeiten Sie (beide Seiten)? – ranieuwe

Antwort

0

Dies sollte helfen: http://geekswithblogs.net/claraoscura/archive/2007/08/20/114806.aspx scheint, dass die Lösung eine Konfigurationsdatei für svcutil zu erstellen und sie in den gleichen Ordner wie es platzieren.

+0

danke dafür. Ich habe eine Konfigurationsdatei für SvcUtil.exe hinzugefügt, die ich oben beschrieben habe. Allerdings bekomme ich immer noch den gleichen Fehler. War es nur die SvcUtil-Datei, die ich ändern muss, oder war es auch die Serverseite? – openshac

+0

Sie sollten nur die verbrauchende Anwendung ändern – ranieuwe

+0

OK, ich habe versucht, die Konfigurationsdatei für SvcUtil (wie oben) zu ändern, aber es funktioniert immer noch nicht. – openshac

1

Ich denke nicht, dass es praktisch ist, die Operationen in mehrere Verträge aufzuteilen? Wenn ich frage, über wie viele Service-Operationen wir reden?

Haben Sie die Lösungen in diesem Post versucht? http://social.msdn.microsoft.com/Forums/vstudio/en-US/17592561-c470-452a-a52c-2a5a2839582c/metadataexchangeclient-and-nametable-character-count-quota

unter anderem Vorschläge werden mit dem Discovery-Protokoll-Metadaten zu lesen, die keine Leser Quoten hat: http://msdn2.microsoft.com/en-us/library/system.web.services.discovery.discoveryclientprotocol.aspx

Die Lösung am Boden schlägt die Standardleser Kontingente in Code ändern, bevor der Dienst starten . Ich glaube, das müsste in einer Custom-ServiceHost-Fabrik gemacht werden. Bitte lassen Sie mich wissen, wenn Sie Hilfe dabei hätten.

Hoffe, das hilft.

+0

Danke, ich habe mir schon den ersten Link angesehen, den du angegeben hast. Unsere Lösung ist wahrscheinlich bereits zu reif, um die Erkennungsmethode wie vorgeschlagen zu ändern. Ich habe gesehen, dass andere Leute Erfolg gehabt haben, den Leser zu ändern, also möchte ich dasselbe tun. Es bedeutet, dass nur ein paar Zeilen zu den Konfigurationsdateien geändert werden. Wenn Sie "in einer benutzerdefinierten ServiceHost-Factory" sagen, was meinen Sie damit? Ist das nicht möglich in den Konfigurationsdateien? – openshac

+0

Auf dieser Seite wird beschrieben, wie Sie einen benutzerdefinierten Service-Host erstellen können, um eine benutzerdefinierte Konfiguration Ihres Service vorzunehmen, zusätzlich zu den Konfigurationsdateien, einschließlich der Verwendung von IIS. http://msdn.microsoft.com/en-us/library/aa395224.aspx Dies ermöglicht Ihnen, Leserkontingente festzulegen, bevor der Dienst erstellt wird, was meiner Meinung nach die Quelle Ihres Problems ist und warum dies nicht möglich ist getan in Config-Dateien allein. Viel Glück! – AFischbein

+0

Bin ich der Meinung, dass die Referenzen von SvcUtil.exe und Visual Studios Service bei dieser Lösung immer noch nicht funktionieren? Unser Build-Prozess ist automatisiert und es ist eigentlich der Build, der ebenfalls fehlschlägt, also muss ich eine Lösung finden, wo ich nur die Konfigurationsdatei modifizieren kann. Eine Reihe anderer Leute haben es geschafft, dieses Problem erfolgreich zu lösen, indem sie die clientseitige Konfigurationsdatei änderten. Ich versuche nur herauszufinden, welche Fehler ich in meiner Konfigurationsdatei habe. – openshac

0

Versuchen Sie, den neuen Wert für die MaxNameTableCharCount-Eigenschaft programmatisch:

Binding binding = endpoint.Binding; 

XmlDictionaryReaderQuotas myReaderQuotas = new XmlDictionaryReaderQuotas(); 
myReaderQuotas.MaxStringContentLength = something; 
myReaderQuotas.MaxArrayLength = something; 
myReaderQuotas.MaxBytesPerRead = something; 
myReaderQuotas.MaxDepth = something; 
myReaderQuotas.MaxNameTableCharCount = something; 

binding.GetType().GetProperty("ReaderQuotas").SetValue(binding, myReaderQuotas, null); 

Hinweis: Sie haben es vor dem Client-Proxy zu setzen und/oder Service-Host erstellt werden. Einmal erstellt, können sie nicht geändert werden.

+0

Unser Build-Prozess ist automatisiert und es ist eigentlich der Build, der auch fehlschlägt, also muss ich eine Lösung finden, wo ich nur die Konfigurationsdatei ändern kann. Eine Reihe anderer Leute haben es geschafft, dieses Problem erfolgreich zu lösen, indem sie die clientseitige Konfigurationsdatei änderten. Ich versuche nur herauszufinden, welche Fehler ich in meiner Konfigurationsdatei habe. – openshac

+0

Wird in der Fehlernachricht immer noch Folgendes angezeigt: "Die maximale Namensanzahl (16384)". Ich habe gesagt, dass ich das versuchen soll, weil es nicht so aussieht, als würde man den neuen Wert dafür lesen (16384 statt 2147483647). Sobald ich ein ähnliches Problem hatte, aber es von der Konfigurationsdatei ändern würde nicht funktionieren, aber es funktionierte zur Laufzeit. –

+0

Ja, die Fehlermeldung ist immer noch gleich. Wie unser Build-Skript eingerichtet wurde, muss ich den Wert in der Konfigurationsdatei angeben. Es hat für andere Benutzer funktioniert, indem Sie die Konfiguration geändert haben. Gibt es einen Grund, warum es nicht für mich funktioniert? – openshac

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

einen Blick auf diese Linie nehmen: maxNameTableCharCount = „1638400“

+0

Danke Bart, aber ich habe bereits diesen Wert von seinem Standardwert von 16384 auf den Maximalwert für eine ganze Zahl erhöht - 2147483647. – openshac