Narzędzie do obsługi metadanych elementu ServiceModel (Svcutil.exe)

Narzędzie ServiceModel Metadata Utility służy do generowania kodu modelu usługi na podstawie dokumentów metadanych i dokumentów metadanych z kodu modelu usługi.

Svcutil.exe

Narzędzie ServiceModel Metadata Tool można znaleźć w lokalizacji instalacji zestawu Windows SDK, w szczególności %ProgramFiles%\Microsoft SDKs\Windows\v6.0\Bin.

Funkcje

W poniższej tabeli przedstawiono podsumowanie różnych funkcji udostępnianych przez to narzędzie oraz odpowiadający mu temat, który omawia sposób jej użycia:

Zadanie Temat
Generuje kod z uruchomionych usług lub dokumentów metadanych statycznych. Generowanie klienta programu WCF na podstawie metadanych usługi
Eksportuje dokumenty metadanych z skompilowanego kodu. Instrukcje: eksportowanie metadanych ze skompilowanego kodu usługi za pomocą programu Svcutil.exe
Weryfikuje skompilowany kod usługi. Instrukcje: weryfikacja skompilowanego kodu usługi za pomocą programu Svcutil.exe
Pobiera dokumenty metadanych z uruchomionych usług. Instrukcje: używanie programu Svcutil.exe do pobierania dokumentów metadanych
Generuje kod serializacji. Instrukcje: skracanie czasu uruchamiania aplikacji klienckich programu WCF za pomocą elementu XmlSerializer

Uwaga

Narzędzie Svcutil zastępuje istniejące pliki na dysku, jeśli nazwy podane jako parametry są identyczne. Może to obejmować pliki kodu, konfigurację lub pliki metadanych. Aby tego uniknąć podczas generowania kodu i plików konfiguracji, użyj przełącznika /mergeConfig .

Ponadto /r przełączniki i /ct dla typów odwołań służą do generowania kontraktów danych. Te przełączniki nie działają podczas korzystania z narzędzia XmlSerializer.

Timeout

Narzędzie ma pięciominutowy limit czasu podczas pobierania metadanych. Ten limit czasu dotyczy tylko pobierania metadanych za pośrednictwem sieci. Nie ma zastosowania do żadnego przetwarzania tych metadanych.

Wielowersyjność

Narzędzie nie obsługuje wielu elementów docelowych. Jeśli chcesz wygenerować artefakt programu .NET Framework 4 z svcutil.exe, użyj svcutil.exe z zestawu .NET Framework 4 SDK. Aby wygenerować artefakt programu .NET Framework 3.5, użyj pliku wykonywalnego z zestawu .NET Framework 3.5 SDK.

Uzyskiwanie dostępu do dokumentów WSDL

Gdy używasz narzędzia Svcutil do uzyskiwania dostępu do dokumentu WSDL, który zawiera odwołanie do usługi tokenu zabezpieczającego (STS), narzędzie Svcutil wykonuje wywołanie programu WS-MetadataExchange do usługi STS. Jednak usługa może uwidocznić swoje dokumenty WSDL przy użyciu funkcji WS-MetadataExchange lub HTTP GET. W związku z tym, jeśli usługa STS uwidoczniła tylko dokument WSDL przy użyciu protokołu HTTP GET, klient napisany w systemie WinFX zakończy się niepowodzeniem. W przypadku klientów napisanych w programie .NET Framework 3.5 narzędzie Svcutil próbuje użyć zarówno programu WS-MetadataExchange, jak i protokołu HTTP GET w celu uzyskania języka WSDL usługi STS.

Korzystanie z SvcUtil.exe

Typowe zastosowania

W poniższej tabeli przedstawiono niektóre często używane opcje dla tego narzędzia:

Opcja Opis
/directory:<directory> Katalog do tworzenia plików.

Ustawienie domyślne: bieżący katalog.

Krótka forma: /d
/help Wyświetla składnię polecenia i opcje narzędzia.

Krótka forma: /?
/noLogo Pomijanie wiadomości o prawach autorskich i banerach.
/svcutilConfig:<configFile> Określa niestandardowy plik konfiguracji do użycia zamiast pliku App.config. Może to służyć do rejestrowania rozszerzeń system.serviceModel bez zmiany pliku konfiguracji narzędzia.
/target:<typ danych wyjściowych> Określa dane wyjściowe, które mają być generowane przez narzędzie.

Prawidłowe wartości to kod, metadane lub xmlSerializer.

Krótka forma: /t

Generowanie kodu

Svcutil.exe może generować kod dla kontraktów usług, klientów i typów danych z dokumentów metadanych. Te dokumenty metadanych mogą znajdować się w trwałym magazynie lub pobierać je w trybie online. Pobieranie w trybie online jest zgodne z protokołem WS-Metadata Exchange lub protokołem DISCO (aby uzyskać szczegółowe informacje, zobacz sekcję Pobieranie metadanych).

Za pomocą narzędzia SvcUtil.exe można generować kontrakty usług i danych na podstawie wstępnie zdefiniowanego dokumentu WSDL. Użyj przełącznika /serviceContract i określ adres URL lub lokalizację pliku, w której można pobrać lub znaleźć dokument WSDL. Spowoduje to wygenerowanie kontraktów usług i danych zdefiniowanych w dokumencie WSDL, który następnie może służyć do implementowania usługi skarg. Aby uzyskać więcej informacji, zobacz How to: Retrieve Metadata and Implement a Compliant Service (Instrukcje: pobieranie metadanych i implementowanie zgodnej usługi).

W przypadku usługi z punktem końcowym BasicHttpContextBinding Svcutil.exe generuje element BasicHttpBinding z atrybutem ustawionym allowCookies na true . Pliki cookie są używane do kontekstu na serwerze. Jeśli chcesz zarządzać kontekstem na kliencie, gdy usługa korzysta z plików cookie, możesz ręcznie zmodyfikować konfigurację, aby użyć powiązania kontekstu.

Uwaga

Svcutil.exe generuje klienta na podstawie pliku WSDL lub zasad odebranych z usługi. Główna nazwa użytkownika (UPN) jest generowana przez łączenie nazwy użytkownika, "@" i w pełni kwalifikowanej nazwy domeny (FQDN). Jednak w przypadku użytkowników, którzy zarejestrowali się w usłudze Active Directory, ten format jest nieprawidłowy, a nazwa UPN wygenerowana przez narzędzie powoduje niepowodzenie uwierzytelniania Kerberos z komunikatem o błędzie "Próba logowania nie powiodła się". Aby rozwiązać ten problem, należy ręcznie naprawić plik klienta wygenerowany przez to narzędzie.

svcutil.exe [/t:code] <metadataDocumentPath>* | <url>* | <epr>

Argument opis
epr Ścieżka do pliku XML, który zawiera punkt końcowy adresowania WSReference dla punktu końcowego usługi obsługującego program WS-Metadata Exchange. Aby uzyskać więcej informacji, zobacz sekcję Pobieranie metadanych.
metadataDocumentPath Ścieżka do dokumentu metadanych (wsdl lub xsd), który zawiera kontrakt do zaimportowania do kodu (.wsdl, .xsd, .wspolicy lub .wsmex).

Narzędzie Svcutil jest zgodne z importami i uwzględniane podczas określania zdalnego adresu URL metadanych. Jeśli jednak chcesz przetworzyć pliki metadanych w lokalnym systemie plików, musisz określić wszystkie pliki w tym argumencie. W ten sposób można użyć narzędzia Svcutil w środowisku kompilacji, w którym nie można mieć zależności sieciowych. Dla tego argumentu można użyć symboli wieloznacznych (*.xsd, *.wsdl).
url Adres URL punktu końcowego usługi, który udostępnia metadane lub dokument metadanych hostowany w trybie online. Aby uzyskać więcej informacji na temat pobierania tych dokumentów, zobacz sekcję Pobieranie metadanych.
Opcja Opis
/Async Generuje zarówno sygnatury metody synchronicznej, jak i asynchronicznej.

Ustawienie domyślne: generuj tylko sygnatury metody synchronicznej.

Krótki formularz: /a
/collectionType:<type> Określa typ kolekcji listy dla klienta WCF.

Ustawienie domyślne: typ kolekcji to System.Array.

Krótki formularz: /ct
/config:<configFile> Określa nazwę pliku konfiguracji wygenerowanego.

Ustawienie domyślne: output.config
/dataContractOnly Generuje kod tylko dla typów kontraktów danych. Typy kontraktów usług nie są generowane.

Należy określić tylko lokalne pliki metadanych dla tej opcji.

Krótki formularz: /dconly
/enableDataBinding Implementuje INotifyPropertyChanged interfejs dla wszystkich typów kontraktów danych w celu włączenia powiązania danych.

Krótki formularz: /edb
/excludeType:<type> Określa w pełni kwalifikowaną lub kwalifikowaną przez zestaw nazwę typu, która ma zostać wykluczona z przywołynych typów kontraktów.

W przypadku używania tego przełącznika razem z oddzielnymi bibliotekami /r DLL pełna nazwa klasy XSD jest przywołynięta.

Krótki formularz: /et
/importXmlTypes Konfiguruje serializator kontraktu danych, aby importować typy kontraktów innych niż dane jako typy IXmlSerializable.
/Wewnętrznego Generuje klasy oznaczone jako wewnętrzne. Ustawienie domyślne: wygeneruj tylko klasy publiczne.

Krótki formularz: /i
/language:<language> Określa język programowania do użycia na potrzeby generowania kodu. Należy podać nazwę języka zarejestrowaną w pliku Machine.config lub w pełni kwalifikowaną nazwę klasy dziedziczonej z CodeDomProviderklasy .

Wartości: c#, cs, csharp, vb, visualbasic, c++, cpp

Ustawienie domyślne: csharp

Krótka forma: /l
/mergeConfig Scala wygenerowaną konfigurację z istniejącym plikiem zamiast zastępować istniejący plik.
/Messagecontract Generuje typy kontraktów komunikatów.

Krótki formularz: /mc
/namespace:<string,string> Określa mapowanie z przestrzeni nazw WSDL lub XML Schema targetNamespace na przestrzeń nazw CLR. Użycie znaku "*" dla przestrzeni targetNamespace mapuje wszystkie przestrzenie targetNamespace bez jawnego mapowania na tę przestrzeń nazw CLR.

Aby upewnić się, że nazwa kontraktu komunikatu nie zderza się z nazwą operacji, należy zakwalifikować odwołanie do typu z ::, lub upewnić się, że nazwy są unikatowe.

Ustawienie domyślne: pochodzi z docelowej przestrzeni nazw dokumentu schematu dla kontraktów danych. Domyślna przestrzeń nazw jest używana dla wszystkich innych wygenerowanych typów.

Krótka forma: Uwaga: /n podczas generowania typów do użycia z narzędziem XmlSerializer obsługiwane jest tylko jedno mapowanie przestrzeni nazw. Wszystkie wygenerowane typy będą znajdować się w domyślnej przestrzeni nazw lub przestrzeni nazw określonej przez '*'.
/noConfig Nie generuj plików konfiguracji.
/noStdLib Nie odwołują się do bibliotek standardowych.

Ustawienie domyślne: odwołania do Mscorlib.dll i System.servicemodel.dll.
/out:<file> Określa nazwę pliku wygenerowanego kodu.

Ustawienie domyślne: pochodzi z nazwy definicji WSDL, nazwy usługi WSDL lub docelowej przestrzeni nazw jednego ze schematów.

Krótka forma: /o
/reference:<ścieżka pliku> Odwołania do typów w określonym zestawie. Podczas generowania klientów użyj tej opcji, aby określić zestawy, które mogą zawierać typy reprezentujące importowane metadane.

Nie można określić kontraktów i XmlSerializer typów komunikatów przy użyciu tego przełącznika.

W przypadku DateTimeOffset odwołania ten typ jest używany zamiast generowania nowego typu. Jeśli aplikacja jest napisana przy użyciu programu .NET Framework 3.5, SvcUtil.exe odwołuje się DateTimeOffset automatycznie.

Krótki formularz: /r
/Serializacji Generuje klasy oznaczone atrybutem z możliwością serializacji.

Krótki formularz: /s
/Servicecontract Generuj kod tylko dla kontraktów usług. Klasa klienta i konfiguracja nie zostaną wygenerowane

Krótki formularz: /sc
/serializer:Auto Automatycznie wybierz serializator. Spowoduje to próbę użycia serializatora kontraktu danych i użycie narzędzia XmlSerializer w przypadku niepowodzenia.

Krótki formularz: /ser
/serializer:DataContractSerializer Generuje typy danych, które używają serializatora kontraktu danych do serializacji i deserializacji.

Krótki formularz: /ser:DataContractSerializer
/serializer:XmlSerializer Generuje typy danych, które używają XmlSerializer elementu do serializacji i deserializacji.

Krótki formularz: /ser:XmlSerializer
/targetClientVersion Określ, która wersja programu .NET Framework jest przeznaczona dla aplikacji. Prawidłowe wartości to Version30 i Version35. Wartością domyślną jest Version30.

Krótki formularz: /tcv

Version30: użyj /tcv:Version30 polecenia , jeśli generujesz kod dla klientów korzystających z systemu WinFX.

Version35: Użyj /tcv:Version35 polecenia , jeśli generujesz kod dla klientów korzystających z programu .NET Framework 3.5. W przypadku korzystania /tcv:Version35 z przełącznika /async generowane są metody asynchroniczne oparte na zdarzeniach i wywołania zwrotnego/delegata. Ponadto obsługa zestawów danych z obsługą linQ i DateTimeOffset jest włączona.
/Pakowane Określa, czy dla dokumentów w stylu literału dokumentu są używane specjalne obudowy z zawiniętymi parametrami. Użyj przełącznika /wrapped z narzędziem Service Model Metadata Tool (Svcutil.exe), aby określić normalną wielkość liter.

Uwaga

Gdy powiązanie usługi jest jednym z powiązań dostarczanych przez system (zobacz Powiązania dostarczone przez system), a ProtectionLevel właściwość jest ustawiona na None wartość lub Sign, Svcutil generuje plik konfiguracji przy użyciu <elementu customBinding> zamiast oczekiwanego elementu dostarczonego przez system. Jeśli na przykład usługa używa <wsHttpBinding> elementu z ustawionym ProtectionLevel na Sign, wygenerowana konfiguracja ma <customBinding> w sekcji powiązania zamiast <wsHttpBinding>. Aby uzyskać więcej informacji na temat poziomu ochrony, zobacz Opis poziomu ochrony.

Eksportowanie metadanych

Svcutil.exe mogą eksportować metadane dla usług, kontraktów i typów danych w skompilowanych zestawach. Aby wyeksportować metadane dla usługi, należy użyć /serviceName opcji , aby określić usługę, którą chcesz wyeksportować. Aby wyeksportować wszystkie typy kontraktów danych w zestawie, należy użyć /dataContractOnly opcji . Domyślnie metadane są eksportowane dla wszystkich kontraktów usług w zestawach wejściowych.

svcutil.exe [/t:metadata] [/serviceName:<serviceConfigName>] [/dataContractOnly] <assemblyPath>*

Argument opis
assemblyPath Określa ścieżkę do zestawu, który zawiera usługi, kontrakty lub typy kontraktów danych do wyeksportowania. Symbole wieloznaczne wiersza polecenia w warstwie Standardowa mogą służyć do udostępniania wielu plików jako danych wejściowych.
Opcja Opis
/serviceName:<serviceConfigName> Określa nazwę konfiguracji usługi do wyeksportowania. Jeśli ta opcja jest używana, zestaw wykonywalny ze skojarzonym plikiem konfiguracji musi zostać przekazany jako dane wejściowe. Svcutil.exe wyszukuje wszystkie skojarzone pliki konfiguracji dla konfiguracji usługi. Jeśli pliki konfiguracji zawierają jakiekolwiek typy rozszerzeń, zestawy zawierające te typy muszą znajdować się w GAC lub jawnie podane przy użyciu /reference opcji .
/reference:<ścieżka pliku> Dodaje określony zestaw do zestawu zestawów używanych do rozpoznawania odwołań typów. Jeśli eksportujesz lub walidujesz usługę korzystającą z rozszerzeń innych firm (zachowania, powiązań i elementów powiązań) zarejestrowanych w konfiguracji, użyj tej opcji, aby zlokalizować zestawy rozszerzeń, które nie znajdują się w GAC.

Krótki formularz: /r
/dataContractOnly Działa tylko na typach kontraktów danych. Kontrakty usług nie są przetwarzane.

Należy określić tylko lokalne pliki metadanych dla tej opcji.

Krótki formularz: /dconly
/excludeType:<type> Określa w pełni kwalifikowaną lub kwalifikowaną nazwę typu, który ma zostać wykluczony z eksportu. Tej opcji można użyć podczas eksportowania metadanych dla usługi lub zestawu kontraktów usług do wykluczania typów z eksportowania. Tej opcji nie można używać razem z opcją /dconly .

Jeśli masz jeden zestaw zawierający wiele usług, a każda z nich używa oddzielnych klas o tej samej nazwie XSD, należy określić nazwę usługi zamiast nazwy klasy XSD dla tego przełącznika.

Typy kontraktów XSD lub danych nie są obsługiwane.

Krótki formularz: /et

Walidacja usługi

Walidacja może służyć do wykrywania błędów w implementacjach usług bez hostowania usługi. Należy użyć /serviceName opcji , aby wskazać usługę, którą chcesz zweryfikować.

svcutil.exe /validate /serviceName:<serviceConfigName> <assemblyPath>*

Argument opis
assemblyPath Określa ścieżkę do zestawu zawierającego typy usług do zweryfikowania. Aby zapewnić konfigurację usługi, zestaw musi mieć skojarzony plik konfiguracji. Standardowe symbole wieloznaczne wiersza polecenia mogą służyć do udostępniania wielu zestawów.
Opcja Opis
/Sprawdzania poprawności Weryfikuje implementację usługi określoną przez /serviceName tę opcję. Jeśli ta opcja jest używana, zestaw wykonywalny ze skojarzonym plikiem konfiguracji musi zostać przekazany jako dane wejściowe.

Krótki formularz: /v
/serviceName:<serviceConfigName> Określa nazwę konfiguracji usługi do zweryfikowania. Svcutil.exe wyszukuje wszystkie skojarzone pliki konfiguracji wszystkich zestawów wejściowych dla konfiguracji usługi. Jeśli pliki konfiguracji zawierają jakiekolwiek typy rozszerzeń, zestawy zawierające te typy muszą znajdować się w GAC lub jawnie podane przy użyciu /reference opcji .
/reference:<ścieżka pliku> Dodaje określony zestaw do zestawu zestawów używanych do rozpoznawania odwołań typów. Jeśli eksportujesz lub walidujesz usługę korzystającą z rozszerzeń innych firm (zachowania, powiązań i elementów powiązań) zarejestrowanych w konfiguracji, użyj tej opcji, aby zlokalizować zestawy rozszerzeń, które nie znajdują się w GAC.

Krótki formularz: /r
/dataContractOnly Działa tylko na typach kontraktów danych. Kontrakty usług nie są przetwarzane.

Należy określić tylko lokalne pliki metadanych dla tej opcji.

Krótki formularz: /dconly
/excludeType:<type> Określa w pełni kwalifikowaną lub kwalifikowaną nazwę typu, który ma zostać wykluczony z walidacji.

Krótki formularz: /et

Pobieranie metadanych

Svcutil.exe można użyć do pobierania metadanych z uruchomionych usług i zapisywania metadanych w plikach lokalnych. Aby pobrać metadane, należy określić /t:metadata opcję . W przeciwnym razie jest generowany kod klienta. W przypadku schematów adresów URL HTTP i HTTPS Svcutil.exe próbuje pobrać metadane przy użyciu programu WS-Metadata Exchange i DISCO. W przypadku wszystkich innych schematów adresów URL Svcutil.exe używa tylko programu WS-Metadata Exchange.

Program Svcutil wysyła następujące żądania metadanych jednocześnie w celu pobrania metadanych.

  • Żądanie MEX (WS-Transfer) do podanego adresu

  • Żądanie MEX do podanego adresu z dołączonym /mex

  • Żądanie DISCO (przy użyciu elementu DiscoveryClientProtocol z asMX) do podanego adresu.

Domyślnie Svcutil.exe używa powiązań zdefiniowanych w MetadataExchangeBindings klasie do tworzenia żądań MEX. Aby skonfigurować powiązanie używane na potrzeby wymiany metadanych WS, należy zdefiniować punkt końcowy klienta w konfiguracji używającej kontraktu IMetadataExchange. Można to zdefiniować w pliku konfiguracji Svcutil.exe lub w innym pliku konfiguracji określonym przy użyciu /svcutilConfig opcji .

svcutil.exe /t:metadata <url>* | <epr>

Argument opis
url Adres URL punktu końcowego usługi, który udostępnia metadane lub dokument metadanych hostowany w trybie online.
epr Ścieżka do pliku XML, który zawiera punkt końcowy adresowania WSReference dla punktu końcowego usługi obsługującego program WS-Metadata Exchange.

Generowanie typu XmlSerializer

Usługi i aplikacje klienckie korzystające z typów danych, które można serializować przy użyciu XmlSerializer kodu generowania i kompilowania serializacji dla tych typów danych w czasie wykonywania, co może spowodować spowolnienie wydajności uruchamiania.

Uwaga

Wstępnie wygenerowany kod serializacji może być używany tylko w aplikacjach klienckich, a nie w usługach.

Svcutil.exe może wygenerować niezbędny kod serializacji języka C# na podstawie skompilowanych zestawów dla aplikacji, co zwiększa wydajność uruchamiania dla tych aplikacji. Aby uzyskać więcej informacji, zobacz How to: Improve the Startup Time of WCF Client Applications using the XmlSerializer (Jak poprawić czas uruchamiania aplikacji klienckich WCF przy użyciu narzędzia XmlSerializer).

Uwaga

Svcutil.exe generuje tylko kod dla typów używanych przez kontrakty usług znalezione w zestawach wejściowych.

svcutil.exe /t:xmlSerializer <assemblyPath>*

Argument opis
assemblyPath Określa ścieżkę do zestawu zawierającego typy kontraktów usług. Typy serializacji są generowane dla wszystkich typów możliwych do serializacji XML w każdym kontrakcie.
Opcja Opis
/reference:<ścieżka pliku> Dodaje określony zestaw do zestawu zestawów używanych do rozpoznawania odwołań typów.

Krótki formularz: /r
/excludeType:<type> Określa w pełni kwalifikowaną lub kwalifikowaną nazwę typu, który ma zostać wykluczony z eksportu lub weryfikacji.

Krótki formularz: /et
/out:<file> Określa nazwę pliku wygenerowanego kodu. Ta opcja jest ignorowana, gdy wiele zestawów jest przekazywanych jako dane wejściowe do narzędzia.

Wartość domyślna: pochodzi z nazwy zestawu.

Krótki formularz: /o
/UseSerializerForFaults Określa, że XmlSerializer element powinien być używany do odczytywania i zapisywania błędów, zamiast domyślnego DataContractSerializer.

Przykłady

Następujące polecenie generuje kod klienta z uruchomionej usługi lub dokumentów metadanych online.

svcutil http://service/metadataEndpoint

Następujące polecenie generuje kod klienta z lokalnych dokumentów metadanych.

svcutil *.wsdl *.xsd /language:C#

Następujące polecenie generuje typy kontraktów danych w języku Visual Basic na podstawie lokalnych dokumentów schematu.

svcutil /dconly *.xsd /language:VB

Następujące polecenie pobiera dokumenty metadanych z uruchomionych usług.

svcutil /t:metadata http://service/metadataEndpoint

Następujące polecenie generuje dokumenty metadanych dla kontraktów usług i skojarzonych typów w zestawie.

svcutil myAssembly.dll

Następujące polecenie generuje dokumenty metadanych dla usługi oraz wszystkie skojarzone kontrakty usług i typy danych w zestawie.

svcutil myServiceHost.exe /serviceName:myServiceName

Następujące polecenie generuje dokumenty metadanych dla typów danych w zestawie.

svcutil myServiceHost.exe /dconly

Następujące polecenie weryfikuje hosting usług.

svcutil /validate /serviceName:myServiceName myServiceHost.exe

Następujące polecenie generuje typy serializacji dla XmlSerializer typów używanych przez wszystkie kontrakty usług w zestawie.

svcutil /t:xmlserializer myContractLibrary.exe

Maksymalny limit przydziału liczby znaków w tabeli nazw

W przypadku używania narzędzia svcutil do generowania metadanych dla usługi może zostać wyświetlony następujący komunikat:

Błąd: Nie można uzyskać metadanych z http://localhost:8000/somesservice/mex maksymalnego limitu przydziału liczby znaków w formie tabeli nazw (16384) został przekroczony podczas odczytywania danych XML. Tabela nametable to struktura danych używana do przechowywania ciągów napotkanych podczas przetwarzania XML — długie dokumenty XML z powtarzającymi się nazwami elementów, nazwami atrybutów i wartościami atrybutów mogą wyzwolić ten limit przydziału. Ten limit przydziału można zwiększyć, zmieniając właściwość MaxNameTableCharCount w obiekcie XmlDictionaryReaderQuotas używanym podczas tworzenia czytnika XML.

Ten błąd może być spowodowany przez usługę, która zwraca duży plik WSDL podczas żądania jego metadanych. Problem polega na tym, że przekroczono limit przydziału znaków dla narzędzia svcutil.exe. Ta wartość jest ustawiona, aby zapobiec atakom typu "odmowa usługi" (dos). Ten limit przydziału można zwiększyć, określając następujący plik konfiguracji dla narzędzia svcutil.

Poniższy plik konfiguracji pokazuje, jak ustawić limity przydziału czytelnika dla narzędzia svcutil

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <customBinding>
                <binding name="MyBinding">
                    <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="MyBinding"
                contract="IMetadataExchange"
                name="http" />
        </client>
    </system.serviceModel>
</configuration>

Utwórz nowy plik o nazwie svcutil.exe.config i skopiuj do niego przykładowy kod XML. Następnie umieść plik w tym samym katalogu co svcutil.exe. Przy następnym uruchomieniu svcutil.exe zostanie ono odebrane nowe ustawienia.

Obawy dotyczące zabezpieczeń

Należy użyć odpowiedniej listy kontroli dostępu (ACL), aby chronić folder instalacyjny Svcutil.exe, Svcutil.config i pliki wskazywane przez /svcutilConfigprogram . Może to uniemożliwić zarejestrowanie i uruchomienie złośliwych rozszerzeń.

Ponadto, aby zminimalizować prawdopodobieństwo naruszenia zabezpieczeń, nie należy dodawać niezaufanych rozszerzeń do części systemu ani używać niezaufanych dostawców kodu z Svcutil.exe.

Na koniec nie należy używać narzędzia w warstwie środkowej aplikacji, ponieważ może to spowodować odmowę usługi do bieżącego procesu.

Zobacz też