2012-04-02 4 views
14

私はTridionコアサービスにSystem.ServiceModel.WsHttpBindingを使用して接続しています。このサービスは、認証されたユーザーによってのみ使用され、たぶん私が制御するコードによってのみ使用されます。私は、次のTridionのコアサービスバインディングのクォータはどのように決定する必要がありますか?

  • (デフォルト524,288バイト)
  • MaxReceivedMessageSize(デフォルト65,536バイト)
  • ReaderQuotasの値を選択する必要があります。 MaxArrayLength(デフォルトは16384バイト)
  • ReaderQuotas。 MaxBytesPerRead(デフォルト4096バイト)
  • ReaderQuotas MaxNameTableCharCount(デフォルトは16384バイト)
  • ReaderQuotas。 MaxStringContentLength(デフォルト8192バイト)私は常に、例えば4Mbのために、デフォルト値よりも大きい値にこれらのうちの少なくともいくつかを設定するコアサービスを使用するために見ている

コード例。これは、デフォルトなどの他の値が使用されているときの既知の問題のためですか?

MaxBufferPoolSizeには、余分なガベージコレクションを防ぐことができます。これは単純にGCを監視し、それに基づいて調整することですか?

MaxReceivedMessageSize、MaxArrayLength、およびMaxBytesPerReadはDos攻撃から防御するため、私のシナリオでは、おそらくこれらを増やすことでスループットを向上させることができます。本当に多数の人が助けてくれますか?

MaxNameTableCharCountは、無制限に成長したくないかもしれない無制限の成長を防ぐために存在するようです。したがって、おそらくデフォルトを残すことは良いことです。

MaxStringContentLengthのドキュメントでは、クォータを超えた場合の動作は指定されていません。おそらくReadContentAsStringは何らかの方法で失敗するため、おそらくこの値は大きくなるはずです。

これらの値はデフォルトのままにしておく必要がありますか?それは私に問題を引き起こすでしょうか?それらを大きな値に増やすべきですか?それはスループットなどに役立つでしょうか、それとも他の問題を引き起こす可能性は高いですか?

+0

いくつかの回答を読んで、これらの設定を調整することは、おそらくゼロ設定の実装(つまりコードのみ)がアンチパターンである可能性があると思われます。思考? –

答えて

7

一般的なルールは、これらの値をできるだけ小さくして、コードを動作させるのに十分です。 CoreService.dllに同梱されているデフォルトの設定を見ると、いくつかの値が増加しています。

たとえば、大きなXMLリスト(または検索結果)を取得する場合は、MaxReceivedMessageSizeを増やす必要があります。フィルタのプロパティBaseColumnsを使用して取得するリストのサイズを制御できることに注意してください。

XML対応のGetList、GetSystemWideList、およびGetSearchResultsメソッドを使用する場合は、MaxReceivedMessageSizeと合わせてReaderQuotas.MaxArrayLengthを増やす必要があります。しかし、大きな配列はメモリに保存されることに注意してください。

制限を超えるまでこれらの値を増やしたいとは思っていません。 WCFは、調整する必要のあるパラメータを指し示すことができます。

+0

私は物事をできるだけ小さく保つことに同意しますが、サイズを増やさなければならないというエラーメッセージから読みやすくすることは大抵の顧客にとってはむしろ拡張機能が突然すべて停止することには受け入れられません。私は現在、特定の応答の予想サイズが何であるかに関する情報がないため、最大設定を選択します。 –

+0

CMSシステムの問題点は、著者が書き込むコンテンツの量を予測することは非常に難しいことです。たとえば、リッチテキストフィールドでコンポーネントを変更して保存する必要がある場合、そのコンポーネントの大きさを知らせる必要はありません。だから私はスペクトルのハイエンドで値を選ぶ傾向があります。 – Quirijn

+0

「正しい」答えがないと言っていますか?そうであれば、あなた自身のシナリオのための良い答えを決定するプロセスについてはどうしたらいいですか?これらの値のうち、デフォルト以外の値を出発点として使用する場合、その値はどれですか? –

6

これは本当にあなたの質問に対する答えではないと思います...しかし、私の経験から、私は値をデフォルトよりも多くしました。すでに提案したように4MBを使用しました。これは、コアサービスと通信中にエラーが発生したためです。それらは、割り当てられたサイズを超える要求/応答サイズに関連していました。

さらに、コアサービスのトランザクション性の場合、これらの例外の多くを見ました。トランザクションを使用すると、要求/応答のサイズがかなり増加するようです。私の場合、1つの大きなトランザクションでコンポーネントのバッチを作成していました。 1つのコンポーネントが作成に失敗した場合は、トランザクション全体をロールバックします。

これが役に立ちます。

+0

ありがとうMihai。どのクォータ/設定が超過しているかを示す可能性があるため、例外が何であるかを知ることは役に立ちます。 –

+0

合意。私はそれらを再現することを検討します。私は心からそれらを覚えていません。 –

+0

私が気づいたことの1つは、拡張機能をインストールした後に特定の応答のサイズが異なる可能性が高いことです.AppDataの使用に関連している可能性が非常に高いです(Community Builderではかなり大きな応答が得られます)。だから、できるだけ小さくするという一般的なルールに同意しますが、残念ながら、特定のアイテムに対するレスポンスの実際のサイズは明確ではありません。したがって、将来のエラーを防ぐためには、可能な限り大きなものを設定したいと思うかもしれません。 –

4

私は最近、コアサービスの実験をしてきたし、次のコードを使用して大TBB(C#のフラグメント)を開こうとするとXmlReaderの例外が発生し見てきました:

using(var client = new CoreService.CoreService2010Client()) 
{ 
    var item = client.Read(tcmId,new ReadOptions()); 

    //More code 
} 

System.Xmlのを。 XmlException:XMLデータを読み取っているときに、最大文字列コンテンツ長の制限(8192)を超えました。この制限は、XMLリーダーを作成するときに使用される XmlDictionaryReaderQuotasオブジェクトのMaxStringContentLengthプロパティを変更することにより、 を増やすことができます。それはメッセージで言うように ライン1、位置9201

、私はこの問題を解決するためにReaderQuotas.MaxStringContentLengthまでに持っていました。したがって、8KBを超えるすべてのビルディングブロックで作業している場合は、このエラーが発生する可能性があります。

関連する問題