このトピックでは、WCF アプリケーションの記述を簡単にする新機能について説明します。
WCF の代替としての gRPC
gRPC は、WCF の一般的な代替手段である最新の RPC フレームワークです。 gRPC は HTTP/2 に基づいて構築されており、WCF に比して次のような多くの利点があります。
- パフォーマンス: gRPC は、特に実行時間の長い接続の場合、WCF よりもはるかに効率的です。
- スケーラビリティ: gRPC は、多数のクライアントとサーバーにスケーリングするように設計されています。
- セキュリティ: gRPC では、TLS や認証など、さまざまなセキュリティ メカニズムがサポートされています。
- クロスプラットフォーム: gRPC はプラットフォームに依存せず、さまざまなプログラミング言語で使用できます。
WCF アプリの開発または gRPC への移行の詳細については、次を参照してください。
生成された構成ファイルの簡略化
Visual Studio でサービス参照を追加するか、SvcUtil.exe ツールを使用すると、クライアント構成ファイルが生成されます。 以前のバージョンの WCF では、これらの構成ファイルには、その値が既定値であっても、すべてのバインド プロパティの値が含まれていました。 WCF 4.5 では、生成された構成ファイルには、既定値以外に設定されているバインド プロパティのみが含まれています。
WCF 3.0 によって生成される構成ファイルの例を次に示します。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard" maxBufferSize="65536"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192"
maxArrayLength="16384" maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
WCF 4.5 によって生成された同じ構成ファイルの例を次に示します。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
コントラクト優先の開発
WCF では、コントラクト優先開発がサポートされるようになりました。 svcutil.exe ツールには /serviceContract スイッチがあり、WSDL ドキュメントからサービス コントラクトとデータ コントラクトを生成できます。
ポータブル サブセット プロジェクトからのサービス参照の追加
移植可能なサブセット プロジェクトを使用すると、.NET アセンブリ プログラマは、複数の .NET 実装 (デスクトップ、Silverlight、Windows Phone、Xbox) をサポートしながら、単一のソース ツリーとビルド システムを維持できます。 ポータブル サブセット プロジェクトは、.NET 実装で使用できるアセンブリである .NET ポータブル ライブラリのみを参照します。 開発者エクスペリエンスは、他の WCF クライアント アプリケーション内にサービス参照を追加する場合と同じです。 詳細については、「 ポータブル サブセット プロジェクトでのサービス参照の追加」を参照してください。
ASP.NET 互換モードの既定の変更
WCF には ASP.NET 互換モードが用意されています。これにより、WCF サービスを記述するときに、ASP.NET HTTP パイプラインの機能へのフル アクセス権を開発者に付与できます。 このモードを使用するには、web.configの > セクションで属性を true に設定する必要があります。さらに、この appDomain 内のすべてのサービスでは、RequirementsMode
の AspNetCompatibilityRequirementsAttribute プロパティを Allowed または Required に設定する必要があります。 既定では、 AspNetCompatibilityRequirementsAttribute は Allowed に設定され、既定の WCF サービス アプリケーション テンプレートによって aspNetCompatibilityEnabled
属性が true
に設定されます。 詳細については、「 Windows Communication Foundation 4.5 および WCF サービスと ASP.NET の新機能」を参照してください。
ストリーミングの機能強化
非同期ストリーミングの新しいサポートが WCF に追加されました。 非同期ストリーミングを有効にするには、 DispatcherSynchronizationBehavior エンドポイントの動作をサービス ホストに追加し、その AsynchronousSendEnabled プロパティを
true
に設定します。 これにより、サービスが読み取り速度が遅い複数のクライアントにストリーミング メッセージを送信する場合に、スケーラビリティが向上する可能性があります。 WCF は、クライアントごとに 1 つのスレッドをブロックしなくなり、スレッドを解放して別のクライアントにサービスを提供します。サービスが IIS でホストされている場合のメッセージのバッファリングに関する制限を削除しました。 以前のバージョンの WCF では、ストリーミング メッセージ転送を使用する IIS でホストされるサービスのメッセージを受信する場合、ASP.NET はメッセージ全体をバッファーしてから WCF に送信していました。 これにより、メモリ消費量が大きくなります。 このバッファリングは .NET Framework 4.5 で削除されました。IIS でホストされる WCF サービスは、メッセージ全体を受信する前に受信ストリームの処理を開始できるため、真のストリーミングが可能になりました。 これにより、WCF はメッセージにすぐに応答でき、パフォーマンスが向上します。 さらに、受信要求の ASP.NET サイズ制限である
maxRequestLength
の値を指定する必要がなくなりました。 このプロパティが設定されている場合は無視されます。maxRequestLength
の詳細については、「<httpRuntime>構成要素」を参照してください。 maxAllowedContentLength を構成する必要があります。詳細については、「 IIS 要求の制限」を参照してください。
トランスポートの新しい既定値
次の表では、変更された設定と、追加情報を検索する場所について説明します。
プロパティ | オン | 新しい既定値 | 詳細情報 |
---|---|---|---|
channelInitializationTimeout | NetTcpBinding | 30 秒 | このプロパティは、.NET フレーム プロトコルを使用して自身を認証するために TCP 接続にかかる時間を決定します。 クライアントは、サーバーが認証を実行するのに十分な情報を持つ前に、いくつかの初期データを送信する必要があります。 このタイムアウトは、悪意のある認証されていないクライアントが接続をサーバーに長時間関連付けないように、意図的に ReceiveTimeout (10 分) よりも小さくされます。 既定値は 30 秒です。 詳細については、以下を参照してください。 ChannelInitializationTimeout |
バックログを監視する | NetTcpBinding | 16 * プロセッサの数 | このソケット レベルのプロパティは、キューに入れる "保留中の受け入れ" 要求の数を示します。 リッスン バックログ キューがいっぱいになると、新しいソケット要求は拒否されます。 詳細については、以下を参照してください。 ListenBacklog |
maxPendingAccepts | ConnectionOrientedTransportBindingElement SMSvcHost.exe |
2 * トランスポート用プロセッサの数 4 * SMSvcHost.exe のプロセッサの数 |
このプロパティは、サーバーがリスナーで待機できるチャネルの数を制限します。 MaxPendingAccepts が小さすぎると、待機しているすべてのチャネルが接続のサービスを開始する間隔が小さくなりますが、新しいチャネルがリッスンを開始できなくなります。 接続がこの間に到着した場合、サーバー上でこの接続を待機しているものがないため、接続は失敗します。 このプロパティは、 MaxPendingConnections プロパティを大きな数値に設定することで構成できます。 詳細については、MaxPendingAcceptsNet.TCP ポート共有サービスの構成を参照してください。 |
最大待機接続数 | ConnectionOrientedTransportBindingElement | 12 * プロセッサの数 | このプロパティは、トランスポートが受け入れたが ServiceModel ディスパッチャーによって取得されていない接続の数を制御します。 この値を設定するには、バインドで MaxConnections を使用するか、バインド要素の maxOutboundConnectionsPerEndpoint を使用します。 詳細については、以下を参照してください。 MaxPendingConnections |
receiveTimeout | SMSvcHost.exe | 30 秒 | このプロパティは、TCP フレーミング データを読み取り、基になる接続から接続ディスパッチを実行するためのタイムアウトを指定します。 これは、受信接続からプリアンブル データを読み取るためにサービス SMSvcHost.exe が関与し続ける時間に上限を設定するために存在します。 詳細については、「 Net.TCP ポート共有サービスの構成」を参照してください。 |
注
これらの新しい既定値は、.NET Framework 4.5 を使用するコンピューターに WCF サービスを展開する場合にのみ使用されます。 .NET Framework 4.0 を使用するコンピューターに同じサービスを展開する場合、.NET Framework 4.0 の既定値が使用されます。 このような場合は、これらの設定を明示的に構成することをお勧めします。
XmlDictionaryReaderQuotas
XmlDictionaryReaderQuotas には、メッセージの作成時にエンコーダーが使用するメモリの量を制限する XML ディクショナリ リーダーの構成可能なクォータ値が含まれています。 これらのクォータは構成可能ですが、既定値が変更され、開発者が明示的に設定する必要が減ります。
MaxReceivedMessageSize
クォータは変更されていないため、メモリ使用量を制限できるため、 XmlDictionaryReaderQuotasの複雑さに対処する必要はありません。 次の表に、クォータ、新しい既定値、各クォータの使用方法の簡単な説明を示します。
クォータの名前 | デフォルト値 | 説明 |
---|---|---|
MaxArrayLength | Int32.MaxValue | 許容される配列の最大長を取得および設定します。 このクォータは、XML リーダーが返すプリミティブの配列の最大サイズ (バイト配列を含む) を制限します。 このクォータでは、XML リーダー自体のメモリ消費量は制限されず、リーダーを使用しているコンポーネントでは制限されません。 たとえば、 DataContractSerializer が MaxArrayLength で保護されたリーダーを使用する場合、このクォータより大きいバイト配列は逆シリアル化されません。 |
MaxBytesPerRead | Int32.MaxValue | 読み取りごとに返される最大許容バイト数を取得および設定します。 このクォータは、要素の開始タグとその属性を読み取るときに、1 回の読み取り操作で読み取るバイト数を制限します。 (ストリーミングされない場合、要素名自体はクォータに対してカウントされません)。 XML 属性の数が多すぎると、属性名の一意性をチェックする必要があるため、処理に時間がかかる可能性があります。 MaxBytesPerRead は、この脅威を軽減します。 |
MaxDepth | 128 ノードの深さ | このクォータにより、XML 要素の入れ子の最大深度が制限されます。 MaxDepth は、 MaxBytesPerReadと対話します。リーダーは常に、現在の要素とそのすべての先祖のメモリにデータを保持するため、リーダーの最大メモリ消費量は、これら 2 つの設定の積に比例します。 深いネストのオブジェクトグラフを逆シリアル化すると、デシリアライザーはスタック全体にアクセスし、回復不能なStackOverflowExceptionを投げることを強制されます。 XML の入れ子とオブジェクトの入れ子の間には、 DataContractSerializer と XmlSerializerの両方に対して直接的な相関関係があります。 MaxDepth は、この脅威を軽減するために使用されます。 |
MaxNameTableCharCount | Int32.MaxValue | このクォータは、ネームテーブルで許可される最大文字数を制限します。 名前テーブルには、XML ドキュメントの処理中に検出される特定の文字列 (名前空間やプレフィックスなど) が含まれています。 これらの文字列はメモリにバッファーされるため、このクォータは、ストリーミングが予想される場合に過剰なバッファリングを防ぐために使用されます。 |
MaxStringContentLength | Int32.MaxValue | このクォータにより、XML リーダーから返される文字列の最大サイズが制限されます。 このクォータでは、XML リーダー自体ではなく、リーダーを使用しているコンポーネントでのメモリ使用量が制限されます。 たとえば、 DataContractSerializer が MaxStringContentLengthで保護されたリーダーを使用する場合、このクォータより大きい文字列は逆シリアル化されません。 |
Von Bedeutung
データのセキュリティ保護の詳細については、「 データのセキュリティに関する考慮事項 」の「XML を安全に使用する」を参照してください。
注
これらの新しい既定値は、.NET Framework 4.5 を使用するコンピューターに WCF サービスを展開する場合にのみ使用されます。 .NET Framework 4.0 を使用するコンピューターに同じサービスを展開する場合、.NET Framework 4.0 の既定値が使用されます。 このような場合は、これらの設定を明示的に構成することをお勧めします。
WCF 構成の検証
Visual Studio 内のビルド プロセスの一環として、WCF 構成ファイルが検証されるようになりました。 検証に失敗すると、検証エラーまたは警告の一覧が Visual Studio に表示されます。
XML エディターのヒント
新規および既存の WCF サービス開発者がサービスを構成できるように、Visual Studio XML エディターには、サービス構成ファイルの一部であるすべての構成要素とそのプロパティに関するヒントが用意されています。
BasicHttpBinding の機能強化
単一の WCF エンドポイントがさまざまな認証モードに応答できるようにします。
WCF サービスのセキュリティ設定を IIS によって制御できるようにします