まず、根本的には大きなデータはサービス拒否攻撃の対象になるのでなるべく送らないようにしたほうがよいと思います。とはいっても業務システムでは大きなデータを扱う必要があるのでデフォルト値から変更したほうがよいパラメタを挙げます。

まず最初にバッファ,ストリーミング通信の両方で、大きなメッセージを扱うときに注意するべき設定値が記載されているページとトランスポートクォータのページを一読しましょう。私もよく読み返します。

-セキュリティに関するデータの考慮事項 
http://msdn.microsoft.com/ja-jp/library/ms733135.aspx
-トランスポートクオータ
http://msdn.microsoft.com/ja-jp/library/ms731078.aspx

 1. クオータ値の設定

大きいサイズのメッセージを扱う場合はクォータ値に注意します。デフォルト値で動かない場合は、maxReceivedMessageSize,maxBufferSize,maxArrayLengthを特に注意します。
表に載せていないデータでもsendTimeout,receiveTimeout属性値なども必要に応じて変更して下さい。以下の表は本トピックの最初に参照している、MSDNのトランスポートクオータのページにある表とセキュリティに関するデータの考慮事項ページのリーダーのクオータの説明の抜粋です。上述した2つのページには注意すべきクオータの説明が載っているので一度は呼んでおくことをお勧めします。

 

maxReceivedMessageSize ヘッダーを含む、受信メッセージの最大サイズ (バイト単位)。これを超えるとトランスポートで例外が発生します。
maxBufferSize ストリーミング データ用に使用されるバッファの最大サイズ (バイト単位)。このトランスポート クォータが設定されていない、またはトランスポートがストリーミングを使用しない場合、このクォータ値は MaxReceivedMessageSize クォータ値と MaxValue の小さい方と同じになります。
maxArrayLength  XML リーダーが返すプリミティブ配列 (バイト配列など) の最大サイズを制限します。
maxStringContentLength  このクォータは、XML リーダーが返す文字列の最大サイズを制限します。

 

以下定義例。bindingエレメントとreadQuotasエレメント(System.XML.XMLDictionaryReaderQuotas)の設定値は重要な項目が多いです。

<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_LargeService" maxBufferSize="64000000" maxBufferPoolSize="4288" maxReceivedMessageSize="64000000" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" >
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="64000000" maxBytesPerRead="4096"/>
      <security mode="None">
           ....
      </security>
    </binding>
  </basicHttpBinding>
</bindings> 

2.配列やコンテナ型の要素数が多い場合

要素数が多い場合は、maxItemsInObjectGraphの値を調整します。maxItemsInObjectGraphはbehaviorのdataContractSerializer要素に設定します。

<behaviors>
      <serviceBehaviors>
        <behavior name="LargeSizeServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <dataContractSerializer maxItemsInObjectGraph="100000000"/>
        </behavior>
      </serviceBehaviors>
</behaviors>

 3.ASP.NET環境上で動作する場合の設定

自己ホストではWCFの設定だけで問題ないのですが、ASP.NETサーバの環境設定値の制限(受信最大バイト数)でエラーが発生する場合があります。

以下エラーメッセージ

"An error occurred while receiving the HTTP response to http://XXXX/BBB/Service.svc. This could be due to the service endpoint binding not using the HTTP protocol.This could also be due to an HTTP request context being aborted by the server (possibly due to the server shutting down). See server logs for more details."

この場合はhttpRuntimeセクションをWeb.configに作成し、maxRequestLengthの値をデフォルト値の4096KBから必要なサイズに変更しましょう。(以下例)

<configuration>
  ...
  <system.web>
    <httpRuntime
    maxRequestLength = "64000"
            />
    ....
   </system.web>
</configuration>

必要に応じてASP.NET実行環境のその他の設定値を修正して下さい。デフォルト値は%windir%Microsoft.NET\Framework\v2.0.50727\CONFIG\Web.config.commentsに書いてあります。