大量のデータを送信するサービスを扱っているとしましょう。
これを WCF で実装した場合、WCF は各リクエストが処理するのに必要なメモリ量に基づいてサービスを調整しますか? それとも、サービスに対して多数のヒットを受信するたびに、メモリ不足の例外が継続的に発生するのでしょうか?
私はWCFの外でこの問題に対処することに非常に興味があります.私はまだサービス開発に少し慣れていません...
大量のデータを送信するサービスを扱っているとしましょう。
これを WCF で実装した場合、WCF は各リクエストが処理するのに必要なメモリ量に基づいてサービスを調整しますか? それとも、サービスに対して多数のヒットを受信するたびに、メモリ不足の例外が継続的に発生するのでしょうか?
私はWCFの外でこの問題に対処することに非常に興味があります.私はまだサービス開発に少し慣れていません...
Andrew Hare が提案するようなバインディング属性とリーダークォータを使用すると、ほとんどの実用的な用途で本質的に無制限のサイズが可能になりますが、長時間実行されるコマンドを受け入れると、そのサービスがどのようなものであっても、タイムアウトなどの他の問題が発生することに注意してください。構築されます (WCF を使用するかどうかに関係なく)。
メッセージのサイズに関係なく、フラッディングしないように、WCF サービスのパフォーマンスを調整する必要があります。IIS または WAS でホストしている場合は、これらのホスティング環境に追加の組み込み機能があり、サービスをより「高可用性」にすることができます。ただし、並行性の問題には注意を払う必要があります。次の WCF 構成は、いくつかのスロットリング値を設定する例を示しています。
<system.serviceModel>
...
<behaviors>
<serviceBehaviors>
<behavior name="GenericServiceBehavior">
<serviceTimeouts transactionTimeout="00:09:10"/>
<serviceThrottling
maxConcurrentCalls="20"
maxConcurrentSessions="20"
maxConcurrentInstances="20"
/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
WCFには、特定のバイト数を超えるメッセージを拒否するデフォルトのペイロードサイズ制限があります。もちろん、これは構成ファイルのバインディングセクションで構成できます。これは、利用可能な属性の多くを示す大まかな例basicHttpBinding
です。
<bindings>
<basicHttpBinding>
<binding name="testBinding" maxReceivedMessageSize="2147483647">
<readerQuotas
maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
アイデアは、さまざまなシナリオで使用できるさまざまなバインディングを作成できるということです。これは、サービスの消費方法を微調整し、サービスを必要とするエンドポイントのメッセージサイズ制限のみを増やすことができるので便利です。
NetTCPBinding または NetNamedPipeBinding を使用している場合は、MaxConnections プロパティを使用できます。
<bindings>
<netTcpBinding>
<binding name="myTCPBinding" maxConnections="15"/>
</netTcpBinding>
</bindings>