[ データ量の制限 ]
WCFで用意されている各バインディングセットには、コンフィギュレーション用のセクションが用意されています。以下は代表的なバインディングセットのコンフィギュレーションセクションです。
- BasicHttpBinding: [ system.serviceModel ] - [ bindings ] - [ basicHttpBinding ] - [ binding ] セクション
- WsHttpBinding:[ system.serviceModel ] - [ bindings ] - [ wsHttpBinding ] - [ binding ] セクション
- WsDualHttpBinding:[ system.serviceModel ] - [ bindings ] - [ wsDualHttpBinding ] - [ binding ] セクション
- NetTcpBinding:[ system.serviceModel ] - [ bindings ] - [ netTcpBinding ] - [ binding ] セクション
- NetNamedPipeBinding:[ system.serviceModel ] - [ bindings ] - [ netNamedPipeBinding ] - [ binding ] セクション
- NetMsmqBinding:[ system.serviceModel ] - [ bindings ] - [ netMsmqBinding ] - [ binding ] セクション
- MsmqIntegrationBinding:[ system.serviceModel ] - [ bindings ] - [ msmqIntegrationBinding ] - [ binding ] セクション
これらのセクションのmaxReceivedMessageSize属性にて、通信データ量の制限値をバイト単位で設定できます。既定値は65536 ( 0x10000 ) バイトとなります。
また、WCFによるWebサービスでは、 [system.web] - [ httpRuntime ] セクションのmaxRequestLength属性でも通信データ量が制限されることに注意します。この属性値の単位はキロバイトで、既定値は4096 ( 0x1000 ) キロバイトとなります。
つまり、maxReceivedMessageSize属性に4194304以上の値を設定する場合、このmaxRequestLength属性も適切な値に変更する必要があります。
この属性はWCF用の属性ではなく、WCF以外のWebサービスでも有効な属性です。 ( 参考:大量データに対する戦略 )
[ 詳細な制限 ]
各バインディング用セクションの子要素である [ readerQuotas ] セクションの各属性にて、通信データの詳細な制限が設定できます。
maxArrayLength属性
SOAPメッセージで扱う配列型のデータの長さ ( 配列の要素数 ) を制限します。
既定値:16384 ( 0x4000 )
maxBytesPerRead属性
不明・・・。 ( 恐らく操作結果メッセージのサイズ制限。 )
既定値:4096 ( 0x1000 ) バイト
maxDepth属性
SOAPメッセージの、XMLノードの入れ子の深さを制限します。
既定値:32 ( 0x20 ) レベル
maxNameTableCharCount属性
不明・・・。
既定値:16384 ( 0x4000 )
maxStringContentLength属性
SOAPメッセージで扱うString型のデータの長さ ( 文字数 ) を制限します。
既定値:8192 ( 0x2000 ) 文字
[ 設定例 ]
引数でバイナリデータ ( Byte型の配列 ) を受け取る、WsHttpBindingを適用したWCF Webサービスにて、バイナリデータのサイズ制限を10MBとする場合 ( 通信データのサイズ制限は10.5MBとする ) のWeb.config設定例を以下に示します。
<system.serviceModel>
<services>
<service name="Service1">
<endpoint binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_IService1" contract="IService1" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="wsHttpBinding_IService1" messageEncoding="Mtom" maxReceivedMessageSize="11010048">
<readerQuatas maxArrayLength="10485760" />
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
<system.web>
<httpRuntime maxRequestLength="10752" />
</system.web>
> maxBytesPerRead属性
入力ストリームの一度のRead()で読み込むバイト数。Read()の引数に渡す配列のサイズ = 消費メモリ量に影響します。
> maxNameTableCharCount属性
XmlDictionaryReaderのNameTableに格納される名前文字列(XML要素名、属性名、名前空間URIなど)の最大長、あるいはname tableに格納される全文字列の最大バイト数(どちらなのかは、小さい値で調べればすぐ分かるかと)。
どちらもSystem.Xmlの設計に詳しくなれば、理解できると思います。
あ、ちなみに僕も「正解」を知っているわけではありませんよ。↑はあくまで推測です。
2007.02.06 16:19 URL | atsushieno #- [ 編集 ]
atsushienoさん初めまして!
有益な情報ありがとうございます
すぐには無理ですが、検証し次第、コメント欄にて報告したいと思います
2007.02.06 23:48 URL | よこけん #Ay6tTHf6 [ 編集 ]
トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/86-96bc10bc
[.NET][WCF]WCF で長い文字列を返す場合の注意点
UnitTest 用意してて良かった~ - お だ のスペース の続き… Web サービスから WCF に変更した際に、長い文字列を返す UnitTest で例外が発生してしまった。なので少し調べてみたら、次のサイトが引っ掛かった。 WCFで大きなデータを送受信するさいに注意する設定値(クオー
2009.07.01 22:11 | お だ のスペース