ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe)

ServiceModel メタデータ ユーティリティ ツールを使用して、メタデータ ドキュメントからサービス モデル コードを生成したり、サービス モデル コードからメタデータ ドキュメントを生成します。

SvcUtil.exe

ServiceModel メタデータ ユーティリティ ツールは、Windows SDK のインストール場所である C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin にあります。

機能

次の表は、このツールによって提供されるさまざまな機能とその使用方法を説明する対応トピックを示します。

タスク トピック

実行中のサービスまたは静的なメタデータ ドキュメントからコードを生成します。

サービス メタデータからの WCF クライアントの生成

コンパイル済みのコードからメタデータ ドキュメントをエクスポートします。

方法 : Svcutil.exe を使用してコンパイル済みのサービス コードからメタデータをエクスポートする

コンパイル済みサービス コードを検証します。

方法 : Svcutil.exe を使用してコンパイル済みサービス コードを検証する

実行中のサービスからメタデータ ドキュメントをダウンロードします。

方法 : Svcutil.exe を使用してメタデータ ドキュメントをダウンロードする

シリアル化コードを生成します。

方法 : XmlSerializer を使用する WCF クライアント アプリケーションの起動時間を短縮する

Aa347733.Caution(ja-jp,VS.100).gif注意 :
パラメーターに指定された名前が同じ場合、Svcutil はディスク上の既存のファイルを上書きします。 これには、コード ファイル、構成ファイル、またはメタデータ ファイルが含まれます。 コード ファイルや構成ファイルの生成時にこれを回避するには、/mergeConfig スイッチを使用します。

また、データ コントラクト生成には、型参照用の /r スイッチと スイッチがあります。 XmlSerializer の使用時には、これらのスイッチは機能しません。

タイムアウト

メタデータを取得する場合、ツールには、5 分間のタイムアウトがあります。 このタイムアウトは、ネットワーク経由でメタデータを取得する場合にのみ適用されます。 タイムアウトは、そのメタデータの処理には適用されません。

複数バージョン対応

このツールは複数バージョン対応機能をサポートしていません。 svcutil.exe を使用して .NET 4 成果物を生成する場合、.NET 4 SDK から svcutil.exe を実行する必要があります。 .NET 3.5 成果物を生成するには、.NET 3.5 SDK から実行可能ファイルを実行します。

WSDL ドキュメントへのアクセス

Svcutil を使用して、セキュリティ トークン サービス (STS) への参照がある WSDL ドキュメントにアクセスする場合、Svcutil は WS-MetadataExchange を使用して STS を呼び出します。 ただし、サービスは、WS-MetadataExchange または HTTP GET を使用して WSDL ドキュメントを公開できます。 そのため、STS が HTTP GET のみを使用して WSDL ドキュメントを公開している場合、.NET Framework 3.0 で作成されたクライアントは失敗します。 .NET Framework 3.5 で作成されたクライアントの場合は、Svcutil が WS-MetadataExchange と HTTP GET の両方を使用して、STS WSDL の取得を試みます。

SvcUtil.exe の使用

一般的な使用

次の表は、このツールで一般的に使用されるオプションを示します。

オプション 説明

/directory:<directory>

ファイルを作成するためのディレクトリ。

既定 : 現在のディレクトリ

短縮形 : /d

/help

このツールのコマンド構文とオプションを表示します。

短縮形 : /?

/noLogo

著作権やバナー メッセージを表示しません。

/svcutilConfig:<configFile>

App.config ファイルの代わりに使用するカスタム構成ファイルを指定します。 これは、ツールの構成ファイルを変更せずに system.serviceModel 拡張を登録するために使用できます。

/target:<output type>

ツールによって生成される出力を指定します。

有効な値は、コード、メタデータ、または xmlSerializer です。

短縮形 : /t

コード生成オプション

Svcutil.exe は、メタデータ ドキュメントからサービス コントラクト、クライアント、およびデータ型のコードを生成できます。 これらのメタデータ ドキュメントは、永続ストレージにあるか、オンラインで取得できます。 オンライン取得は、WS-Metadata Exchange プロトコルまたは DISCO プロトコルに従います (詳細については、「メタデータのダウンロード」セクションを参照してください)。

BasicHttpContextbinding エンドポイントを使用するサービスの場合は代わりに、Svcutil.exe が、allowCookies 属性を true に設定した BasicHttpBinding を生成します。 Cookie はサーバー側でのコンテキスト用に使用されます。 サービスで Cookie を使用するときにクライアント側でコンテキストを管理する場合は、コンテキスト バインディングを使用するように構成を手動で変更できます。

Aa347733.Caution(ja-jp,VS.100).gif注意 :
Svcutil.exe は、WSDL またはサービスから受け取るポリシー ファイルに基づいてクライアントを生成します。 ユーザー プリンシパル名 (UPN) は、ユーザー名、"@"、および完全修飾ドメイン名 (FQDN) を連結して生成されます。 ただし、Active Directory に登録されているユーザーの場合、この形式は無効であり、ツールが生成する UPN を使用すると、Kerberos 認証でエラーが発生し、エラー メッセージ "ログインに失敗しました" が表示されます。 この問題を解決するには、このツールが生成するクライアント ファイルを手動で修正する必要があります。

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

引数 説明

epr

WS-Metadata Exchange をサポートするサービス エンドポイントで使用する WS-Addressing EndpointReference を含む XML ファイルへのパス。 詳細については、「メタデータのダウンロード」セクションを参照してください。

metadataDocumentPath

コード (.wsdl、.xsd、.wspolicy、または .wsmex) にインポートするためのコントラクトを含むメタデータ ドキュメント (wsdl または xsd) へのパス。

Svcutil は、メタデータにリモート URL を指定するときのインポートとインクルードに従います。 ただし、ローカル ファイル システムでメタデータ ファイルを処理する場合は、この引数にすべてのファイルを指定する必要があります。 この方法では Svcutil を、ネットワークの依存関係を持つことができないビルド環境で使用できます。 この引数には、ワイルドカード (*.xsd、*.wsdl) を使用できます。

url

メタデータを提供するサービス エンドポイントの URL またはオンラインになっているメタデータ ドキュメントの URL。 これらのドキュメントの取得方法の詳細については、「メタデータのダウンロード」セクションを参照してください。

オプション 説明

/async

同期と非同期の両方のメソッド署名を生成します。

既定 : 同期メソッド署名のみを生成します。

短縮形 : /a

/collectionType:<type>

コードがスキーマから生成される場合に、コレクション データ型として使用される完全修飾のまたはアセンブリ修飾の型名を指定します。

短縮形: /ct

/config:<configFile>

生成される構成ファイルの名前を指定します。

既定値: output.config

/dataContractOnly

データ コントラクト型に対してのみコードを生成します。 サービス コントラクト型は生成されません。

このオプションにはローカル メタデータ ファイルだけを指定する必要があります。

短縮形: /dconly

/enableDataBinding

データ バインディングを有効にするために、すべてのデータ コントラクト型に INotifyPropertyChanged インターフェイスを実装します。

短縮形: /edb

/excludeType:<type>

参照されるコントラクト型から除外する完全修飾またはアセンブリ修飾の型名を指定します。

このスイッチを個別の DLL から /r と共に使用する場合は、XSD クラスの完全名を参照します。

短縮形: /et

/importXmlTypes

非データ コントラクト型を IXmlSerializable 型としてインポートするようにデータ コントラクト シリアライザーを構成します。

/internal

内部としてマークされるクラスを生成します。 既定 : パブリック クラスのみを生成します。

短縮形: /i

/language:<language>

コード生成に使用するプログラミング言語を指定します。 Machine.config ファイルに登録された言語名か、CodeDomProvider から継承するクラスの完全修飾名のいずれかを指定する必要があります。

値 : c#、cs、csharp、vb、visualbasic、c++、cpp

既定値: csharp

短縮形 : /l

Aa347733.note(ja-jp,VS.100).gif注 :
スイッチは、Visual Studio 2005 SP1 に付属するコード プロバイダーの C++ だけをサポートします。

/mergeConfig

既存のファイルを上書きする代わりに、生成される構成ファイルを既存のファイルにマージします。

/messageContract

メッセージ コントラクト型を生成します。

短縮形: /mc

/namespace:<string,string>

WSDL または XML スキーマの targetNamespace から CLR 名前空間へのマッピングを指定します。 targetNamespace に '*' を使用すると、マッピングを明示的に指定せずにすべての targetNamespace をその CLR 名前空間にマップします。

メッセージ コントラクト名が操作名と競合しないようにするには、型参照を :: で修飾するか、名前を一意にする必要があります。

既定 : データ コントラクトのスキーマ ドキュメントのターゲット名前空間から派生します。 既定の名前空間は、生成される他のすべての型に使用されます。

短縮形: /n

/noConfig

構成ファイルを生成しません。

/noStdLib

標準ライブラリを参照しません。

既定 : Mscorlib.dll と System.servicemodel.dll を参照します。

/out:<file>

生成されるコードのファイル名を指定します。

既定 : WSDL 定義名、WSDL サービス名、またはスキーマの 1 つのターゲット名前空間から派生します。

短縮形 : /o

/serializable

シリアル化可能属性でマークされたクラスを生成します。

短縮形: /s

/targetClientVersion

アプリケーションが対象としている .NET Framework のバージョンを指定します。 有効値は Version30 または Version35 です。 既定値は、Version30 です。

短縮形: /tcv

Version30: .NET Framework 3.0 を使用するクライアントのコードを生成している場合は、/tcv:Version30 を使用します。

Version35: .NET Framework 3.5 を使用するクライアントのコードを生成している場合は、/tcv:Version35 を使用します。 /async スイッチを指定して /tcv:Version35 を使用している場合は、イベントベースおよびコールバック/デリゲートベースの非同期メソッドが生成されます。 また、LINQ 対応のデータセットおよび DateTimeOffset のサポートが有効になっています。

/reference:<file path>

指定されたアセンブリの型を参照します。 クライアントの生成時に、このオプションを使用して、インポートするメタデータを表す型を含むアセンブリを指定します。

このスイッチを使用して、メッセージ コントラクト型と XmlSerializer 型は指定できません。

DateTimeOffset が参照されている場合、新しい型を生成する代わりにこの型が使用されます。 アプリケーションが .NET Framework 3.5 を使用して記述されている場合、SvcUtil.exe は、自動的に DateTimeOffset を参照します。

短縮形: /r

/serializer:Auto

シリアライザーを自動的に選択します。 これは、データ コントラクト シリアライザーを使用します。 この処理が失敗すると、XmlSerializer が使用されます。

短縮形: /ser:Auto

/serializer:DataContractSerializer

シリアル化と逆シリアル化にデータ コントラクト シリアライザーを使用するデータ型を生成します。

短縮形: /ser:DataContractSerializer

/serializer:XmlSerializer

シリアル化と逆シリアル化に XmlSerializer を使用するデータ型を生成します。

短縮形: /ser:XmlSerializer

/wrapped

ラップされたパラメーターを含んでいるドキュメント リテラル スタイルのドキュメントに特別な大文字と小文字の規則が使用されるかどうかを制御します。 通常の大文字と小文字の規則を指定するには、ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) ツールで /wrapped スイッチを使用します。

Aa347733.note(ja-jp,VS.100).gif注 :
サービス バインディングがシステム指定のバインディング (「システム標準のバインディング」を参照) のいずれかであり、ProtectionLevel プロパティが None または Sign のどちらかに設定されている場合、Svcutil は、予期されるシステム指定の要素の代わりに <customBinding> 要素を使用して構成ファイルを生成します。 たとえば、サービスが、ProtectionLevelSign に設定された <wsHttpBinding> 要素を使用する場合、生成される構成には、バインディング セクションに <wsHttpBinding> の代わりに <customBinding> があります。 保護レベルの詳細については、「保護レベルの理解」を参照してください。

メタデータのエクスポート

Svcutil.exe は、コンパイル済みアセンブリのサービス、コントラクト、およびデータ型のメタデータをエクスポートできます。 サービスのメタデータをエクスポートするには、/serviceName オプションを使用して、エクスポートするサービスを指定する必要があります。 アセンブリ内のすべてのデータ コントラクト型をエクスポートするには、/dataContractOnly オプションを使用する必要があります。 既定では、入力アセンブリのすべてのサービス コントラクトのメタデータがエクスポートされます。

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

引数 説明

assemblyPath

エクスポートされるサービス、コントラクト、またはデータ コントラクト型を格納するアセンブリへのパスを指定します。 標準のコマンド ライン ワイルドカードを使用して、複数のファイルを入力として指定できます。

オプション 説明

/serviceName:<serviceConfigName>

エクスポートされるサービスの構成名を指定します。 このオプションを使用した場合、関連構成ファイルが存在する実行可能アセンブリを入力として渡す必要があります。 Svcutil.exe は、すべての関連構成ファイルからサービス構成を検索します。 構成ファイルが拡張型を含む場合、これらの型を含むアセンブリは GAC に存在するか、/reference オプションを使用して明示的に指定される必要があります。

/reference:<file path>

指定したアセンブリを、型参照の解決に使用するアセンブリの集合に追加します。 サービスのエクスポートまたは検証に、構成に登録されているサードパーティ製拡張機能 (Behaviors、Bindings、および BindingElements) を使用している場合は、このオプションを使用して GAC に含まれていない拡張機能アセンブリを指定します。

短縮形: /r

/dataContractOnly

データ コントラクト型に対してのみ機能します。 サービス コントラクトは処理されません。

このオプションにはローカル メタデータ ファイルだけを指定する必要があります。

短縮形: /dconly

/excludeType:<type>

エクスポートから除外する完全修飾またはアセンブリ修飾の型名を指定します。 このオプションは、エクスポートから型を除外するために、サービスのメタデータまたはサービス コントラクトのセットをエクスポートするときに使用できます。 このオプションは /dconly オプションとは併用できません。

複数のサービスを含む単一のアセンブリが存在し、それぞれのサービスが同じ XSD 名の別のクラスを使用している場合は、このスイッチに XSD クラス名の代わりにサービス名を指定する必要があります。

XSD またはデータ コントラクト型はサポートされていません。

短縮形: /et

サービスの検証

検証は、サービスをホストせずにサービス実装でエラーを検出するために使用できます。 /serviceName オプションを使用して、検証するサービスを指定する必要があります。

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

引数 説明

assemblyPath

検証するサービス型を格納するアセンブリへのパスを指定します。 アセンブリに、サービス構成を提供する関連構成ファイルが存在している必要があります。 標準のコマンド ライン ワイルドカードを使用して、複数のアセンブリを指定できます。

オプション 説明

/validate

/serviceName オプションによって指定されたサービス実装を検証します。 このオプションを使用した場合、関連構成ファイルが存在する実行可能アセンブリを入力として渡す必要があります。

短縮形: /v

/serviceName:<serviceConfigName>

検証するサービスの構成名を指定します。 Svcutil.exe は、すべての入力アセンブリのすべての関連構成ファイルからサービス構成を検索します。 構成ファイルが拡張型を含む場合、これらの型を含むアセンブリは GAC に存在するか、/reference オプションを使用して明示的に指定される必要があります。

/reference:<file path>

指定したアセンブリを、型参照の解決に使用するアセンブリの集合に追加します。 サービスのエクスポートまたは検証に、構成に登録されているサードパーティ製拡張機能 (Behaviors、Bindings、および BindingElements) を使用している場合は、このオプションを使用して GAC に含まれていない拡張機能アセンブリを指定します。

短縮形: /r

/dataContractOnly

データ コントラクト型に対してのみ機能します。 サービス コントラクトは処理されません。

このオプションにはローカル メタデータ ファイルだけを指定する必要があります。

短縮形: /dconly

/excludeType:<type>

検証から除外する完全修飾のまたはアセンブリ修飾の型名を指定します。

短縮形: /et

メタデータのダウンロード

Svcutil.exe を使用すると、実行中のサービスからメタデータをダウンロードして、ローカル ファイルに保存できます。 メタデータをダウンロードするには、/t:metadata オプションを指定する必要があります。 それ以外の場合は、クライアント コードが生成されます。 URL スキームが HTTP および HTTPS の場合、Svcutil.exe はメタデータの抽出に WS-Metadata Exchange および DISCO を使用します。 その他の URL スキームの場合、Svcutil.exe は WS-Metadata Exchange のみを使用します。

Svcutil は、メタデータを取得するために次のメタデータ要求を同時に発行します。

  • 指定されたアドレスへの MEX (WS-Transfer) 要求

  • 指定されたアドレスへの /mex 付きの MEX 要求

  • 指定されたアドレスへの (ASMX から DiscoveryClientProtocol を使用した) DISCO 要求

既定では、Svcutil.exe は MetadataExchangeBindings クラスに定義されているバインディングを使用して、MEX 要求を行います。 WS-Metadata Exchange で使用するバインディングを構成するには、IMetadataExchange コントラクトを使用するクライアント エンドポイントを構成に定義する必要があります。 これを定義できる場所は、Svcutil.exe の構成ファイルか、/svcutilConfig オプションを使用して指定された別の構成ファイルです。

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

引数 説明

url

メタデータを提供するサービス エンドポイントの URL またはオンラインになっているメタデータ ドキュメントの URL。

epr

WS-Metadata Exchange をサポートするサービス エンドポイントの WS-Addressing EndpointReference を含む XML ファイルへのパスです。

XmlSerializer 型の生成

XmlSerializer を使用してシリアル化できるデータ型を使用するサービスおよびクライアント アプリケーションは、実行時にこのようなデータ型のシリアル化コードを生成およびコンパイルします。このため、起動時のパフォーマンスが低下することがあります。

Aa347733.note(ja-jp,VS.100).gif注 :
事前生成済みシリアル化コードはクライアント アプリケーションでのみ使用できます。サービスでは使用できません。

Svcutil.exe は、必要な C# シリアル化コードをアプリケーションのコンパイル済みアセンブリから生成できるため、このようなアプリケーションの起動時のパフォーマンスが改善されます。 詳細については、「方法 : XmlSerializer を使用する WCF クライアント アプリケーションの起動時間を短縮する」を参照してください。

Aa347733.note(ja-jp,VS.100).gif注 :
Svcutil.exe は、入力アセンブリに存在するサービス コントラクトによって使用される型用のコードを生成します。

svcutil.exe /t:xmlSerializer <assemblyPath>*

引数 説明

assemblyPath

サービス コントラクト型を格納するアセンブリへのパスを指定します。 シリアル化型は、各コントラクトのすべての Xml シリアル化可能型に対して生成されます。

オプション 説明

/reference:<file path>

指定したアセンブリを、型参照の解決に使用するアセンブリの集合に追加します。

短縮形: /r

/excludeType:<type>

エクスポートや検証から除外する完全修飾のまたはアセンブリ修飾の型名を指定します。

短縮形 : /et

/out:<file>

生成されるコードのファイル名を指定します。 このオプションは、複数のアセンブリが入力としてツールに渡される場合は無視されます。

既定 : アセンブリ名から派生します。

短縮形: /o

/UseSerializerForFaults

既定の DataContractSerializer ではなく、XmlSerializer をエラーの読み書きに使用する必要があることを指定します。

次のコマンドにより、実行中のサービスまたはオンラインのメタデータ ドキュメントからクライアント コードが生成されます。

svcutil http://service/metadataEndpoint

次のコマンドにより、ローカルのメタデータ ドキュメントからクライアント コードが生成されます。

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

次のコマンドにより、ローカルのスキーマ ドキュメントからデータ コントラクト型が Visual Basic で生成されます。

svcutil /dconly *.xsd /language:VB

次のコマンドにより、実行中のサービスからメタデータ ドキュメントがダウンロードされます。

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

次のコマンドにより、アセンブリに含まれるサービス コントラクトと関連する型のメタデータ ドキュメントが生成されます。

svcutil myAssembly.dll

次のコマンドにより、アセンブリに含まれるサービス、すべての関連するサービス コントラクト、およびデータ型のメタデータ ドキュメントが生成されます。

svcutil myServiceHost.exe /serviceName:myServiceName

次のコマンドにより、アセンブリに含まれるデータ型のメタデータ ドキュメントが生成されます。

svcutil myServiceHost.exe /dconly

次のコマンドにより、サービス ホスティングが検証されます。

svcutil /validate /serviceName:myServiceName myServiceHost.exe

次のコマンドにより、アセンブリに含まれているサービス コントラクトによって使用される XmlSerializer 型用のシリアル化型を生成します。

svcutil /t:xmlserializer myContractLibrary.exe

最大 Nametable 文字数のクォータ

svcutil を使用してサービスのメタデータを生成する場合、次のメッセージが表示されます。

エラー: https://localhost:8000/somesservice/mex からメタデータを取得できない XML データの読み取り中に、最大 nametable 文字数のクォータ (16384) を超えました。 nametable は、XML 処理時に検出された文字列を格納するためのデータ構造です。反復されない要素名、属性名、および属性値が含まれた長い XML ドキュメントによってこのクォータがトリガーされることがあります。 このクォータを増やすには、XML リーダーの作成時に使用される XmlDictionaryReaderQuotas オブジェクトの MaxNameTableCharCount プロパティを変更してください。

このエラーの原因は、メタデータの要求時に大きな WSDL ファイルを返すサービスである可能性があります。 その結果、svcutil.exe ツールの文字のクォータを超えることになります。 この値は、サービス拒否 (dos) 攻撃を防止するために設定されています。 このクォータは、次の svcutil の構成ファイルを指定して増やすことができます。

次の構成ファイルは、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>

svcutil.exe.config という名前の新しいファイルを作成し、XML のコード例をこのファイルにコピーします。 svcutil.exe と同じディレクトリにファイルを配置します。 次回 svcutil.exe が実行されると、新しい設定が適用されます。

セキュリティに関する注意事項

適切なアクセス制御リスト (ACL) を使用して、Svcutil.exe のインストール フォルダー、Svcutil.config、および /svcutilConfig によって示されるファイルを保護する必要があります。 これによって、悪質な拡張機能が登録されて実行されるのを防ぐことができます。

さらに、セキュリティの侵害を最小限に抑えるために、信頼できない拡張機能をシステムの一部として追加したり、信頼できないコード プロバイダーを Svcutil.exe で使用しないようにする必要があります。

また、現在のプロセスにサービス拒否を引き起こす可能性があるため、アプリケーションの中間層でツールを使用しないようにする必要があります。

参照

処理手順

方法 : Windows Communication Foundation クライアントを作成する

リファレンス

DataContractAttribute
DataMemberAttribute