2013-08-14 27 views
5

Właśnie zwiększyłem liczbę metod w mojej ServiceContract. kiedy zaktualizować Reference Service w Visual Studio dostaję komunikat:Przekroczono maksymalny limit liczby znaków (16384)

Metadane zawiera odniesienie, które nie mogą zostać rozwiązane: 'Net.TCP: //xxxxx.com: 8002/DataQueryService/mex'.

Wystąpił błąd w dokumencie XML.

Maksymalny znak liczby znaków Ilość przydziału (16384) została przekroczona podczas odczytu danych XML. Nalepka jest strukturą danych używaną do przechowywania ciągów napotkanych podczas przetwarzania XML w formacie XML - długie dokumenty XML z nie powtarzającymi się nazwami elementów, nazwy atrybutów i wartości atrybutów mogą wyzwalać ten przydział. Limit ten można zwiększyć, zmieniając właściwość MaxNameTableCharCount na obiekcie XmlDictionaryReaderQuotas używanym podczas tworzenia czytnika XML .

Oryginalny stronie serwera config było:

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

której zmodyfikowany:

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

Jakie inne zmiany muszę zrobić do mojego config aby uzyskać tej pracy?

Aktualizacja Po wykonaniu rady Chrisa próbowałem zaktualizować plik konfiguracyjny dla SVCUtil. Dodałem nazwę do mojego punktu końcowego, aby był zgodny (zaktualizowany powyżej). SvcUtil.config przedstawia się następująco:

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

Może wiadomości są po prostu zbyt duże lub zbyt złożone z wielu elementów XML/atrybuty? –

+0

Jest to liczba kontraktów operacyjnych, które wzrosły. To powoduje problem. – openshac

+0

Z jaką wersją WCF pracujesz (obie strony)? – ranieuwe

Odpowiedz

0

To powinno pomóc: http://geekswithblogs.net/claraoscura/archive/2007/08/20/114806.aspx Wydaje się, że rozwiązaniem jest utworzenie pliku konfiguracyjnego dla svcutil i umieść go w tym samym folderze co to.

+0

dzięki za to. Dodałem plik konfiguracyjny dla SvcUtil.exe, który mam szczegółowo powyżej. Jednak wciąż mam ten sam błąd. Czy był to po prostu plik SvcUtil, który muszę zmienić, czy też był to po stronie serwera? – openshac

+0

Powinieneś zmienić tylko aplikację zużywającą się. – ranieuwe

+0

OK, próbowałem zmodyfikować plik konfiguracyjny dla SvcUtil (jak wyżej), ale nadal nie działa. – openshac

1

Nie sądzę, że jej praktyczne jest dzielenie operacji na wiele umów? Zastanawiam się, czy pytam, ile operacji serwisowych mówimy?

Czy próbowałeś rozwiązań w tym poście? http://social.msdn.microsoft.com/Forums/vstudio/en-US/17592561-c470-452a-a52c-2a5a2839582c/metadataexchangeclient-and-nametable-character-count-quota

Wśród innych propozycji są przy użyciu protokołu Discovery aby odczytać metadane, które nie mają żadnych limitów czytelnika: http://msdn2.microsoft.com/en-us/library/system.web.services.discovery.discoveryclientprotocol.aspx

Rozwiązanie na dole sugeruje zmianę kwot domyślnego czytnika w kodzie przed uruchomieniem usługi . Uważam, że należałoby to zrobić w niestandardowej fabryce ServiceHost. Daj mi znać, jeśli możesz w tym pomóc.

Mam nadzieję, że to pomoże.

+0

Dzięki, spojrzałem już na pierwszy link, który podałeś. Nasze rozwiązanie jest prawdopodobnie już zbyt dojrzałe, aby zmienić metodę wykrywania zgodnie z sugestią. Widziałem, że inni ludzie odnieśli sukces, zmieniając czytelnikaQuotas, więc chciałbym zrobić to samo. Oznacza to, że to tylko kilka linii zmienia się w pliki konfiguracyjne. Kiedy mówisz "w niestandardowej fabryce ServiceHost", co masz na myśli? Czy nie można tego zrobić w plikach konfiguracyjnych? – openshac

+0

Ta strona opisuje, w jaki sposób można utworzyć niestandardowego hosta usług, aby wykonać niestandardową konfigurację usługi, oprócz czytania plików konfiguracyjnych, w tym sposobu korzystania z usług IIS. http://msdn.microsoft.com/en-us/library/aa395224.aspx Umożliwi to ustawienie kwot czytelników przed utworzeniem usługi, co moim zdaniem jest źródłem problemu i dlaczego nie może być Sporządzono tylko w plikach konfiguracyjnych. Powodzenia! – AFischbein

+0

Czy mam rację sądząc, że odwołania SvcUtil.exe i Visual Studios Service nadal nie będą działać z tym rozwiązaniem. Nasz proces kompilacji jest zautomatyzowany i tak naprawdę jest to również awaria, więc muszę znaleźć rozwiązanie, w którym mogę zmodyfikować plik konfiguracyjny. Wielu innym osobom udało się rozwiązać ten problem, modyfikując plik konfiguracyjny po stronie klienta. Po prostu próbuję dowiedzieć się, jakie błędy mam w moim pliku konfiguracyjnym. – openshac

0

spróbuj ustawić nową wartość dla właściwości MaxNameTableCharCount programowo:

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

Uwaga: trzeba ustawić ją przed proxy klienta i/lub hosta usługi zostały utworzone. Po utworzeniu nie można ich zmienić.

+0

Nasz proces kompilacji jest zautomatyzowany i tak naprawdę jest to również awaria, więc muszę znaleźć rozwiązanie, w którym mogę zmodyfikować plik konfiguracyjny. Wielu innym osobom udało się rozwiązać ten problem, modyfikując plik konfiguracyjny po stronie klienta. Po prostu próbuję dowiedzieć się, jakie błędy mam w moim pliku konfiguracyjnym. – openshac

+0

Czy Twój komunikat o błędzie jest nadal wyświetlany: "Maksymalny limit liczby znaków (16384)". Powiedziałem, aby spróbować, ponieważ nie wygląda na to, że czyta twoją nową wartość (16384 zamiast 2147483647). Kiedyś miałem podobny problem, ale zmiana go z pliku konfiguracyjnego nie działał, ale działał w czasie wykonywania. –

+0

Tak, komunikat o błędzie jest nadal taki sam. W jaki sposób został skonfigurowany nasz skrypt kompilacji, muszę podać wartość w pliku konfiguracyjnym. To działa dla innych użytkowników, zmieniając konfigurację. Czy istnieje jakiś powód, dla którego to nie działa dla mnie? – 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> 

Spójrz na tej linii: maxNameTableCharCount = „1638400”

+0

Dzięki Bart, ale już zwiększyłem tę wartość z domyślnej 16384 do maksymalnej wartości dla liczby całkowitej - 2147483647. – openshac