WCF-メッセージサイズクォータを増やす方法


454

データベースからクライアントに1000レコードを返すWCFサービスがあります。ASP.NET WCFクライアントを持っています(WCFを使用するためにasp.net Webアプリケーションプロジェクトにサービス参照を追加しました)。

クライアントアプリケーションを実行すると、次のメッセージが表示されます。

受信メッセージの最大メッセージサイズクォータ(65536)を超えました。クォータを増やすには、適切なバインディング要素でMaxReceivedMessageSizeプロパティを使用します。

何か助けは?メッセージサイズの割り当てを増やす方法は?


..私は同じ問題を抱えていたんだけど、無愛想なネットワークエラー400を得たが、解決策は、メッセージサイズのthingieだった
ミスターW

2
私は、[1] [リンク] [1]に記載された手順を使用して問題を解決:stackoverflow.com/questions/7476853/...
ラム

なぜデフォルトでそれほど低く設定されているのですか?セキュリティ?
Coops、2015

確かにセキュリティのための@Coops。たとえば、メッセージにクォータを設定すると、DDOS攻撃は(少なくとも少し)実行するのが難しくなります。
Peter van Kekem 2017

回答:


608

App.configまたはWeb.configファイルで、次のようなメッセージサイズの割り当てを増やす必要があります。

<bindings>
    <basicHttpBinding>
        <binding name="basicHttp" allowCookies="true"
                 maxReceivedMessageSize="20000000" 
                 maxBufferSize="20000000"
                 maxBufferPoolSize="20000000">
            <readerQuotas maxDepth="32" 
                 maxArrayLength="200000000"
                 maxStringContentLength="200000000"/>
        </binding>
    </basicHttpBinding>
</bindings>

そして、エンドポイント構成でバインディング名を使用します。

...
bindingConfiguration="basicHttp"
...

値の正当化は単純で、ほとんどのメッセージに対応するのに十分な大きさです。必要に応じてその数を調整できます。低いデフォルト値は基本的にDOSタイプの攻撃を防ぐためにあります。これを20000000にすると、分散型DOS攻撃を効果的に行うことができます。デフォルトサイズの64kは、最近のほとんどのサーバーを圧倒する非常に多数のクライアントを必要とします。


20
ありがとうございます。この変更は、クライアントアプリケーションのweb.configファイルで行う必要があります。
bugBurger 2009年

8
また、サーバー上で変更する必要がある場合があります-大きなデータセットをパラメーターとしてWCFメソッドに送信する必要がある場合。
ネイト

9
ほとんどのメッセージを受け入れるのに十分な大きさです。必要に応じてその数を調整できます。DOSタイプの攻撃を防ぐために基本的に存在します。有効であるために、分散DOS攻撃を可能にする、それ20000000を作り、64Kのデフォルトサイズは、ほとんどのサーバにこれらのday.sを圧倒するために、クライアントの非常に多くを必要とする
ネイト

18
興味のある他の人のために、私は別のブログで最大サイズが2147483647であることを読みました。20000000はこの数より少し小さいので、サービスを中断せずに済む最小の数を使用することは理にかなっています。
proudgeekdad

5
@Slauma入力パラメーターが大きすぎる場合は、サーバーで変更する必要があります。それ以外の場合(可能性が高い)、変更はクライアント構成ファイルで行う必要があります。これは、サービスの応答(パラメーターではない)が大きすぎるためです。
2013年

155

WCFテストクライアントの使用中にこのエラーメッセージが引き続き表示される場合は、クライアントに個別のMaxBufferSize設定があるためです。

問題を修正するには:

  1. ツリーの下部にある構成ファイルノードを右クリックします。
  2. SvcConfigEditorで編集を選択します

MaxBufferSizeを含む、編集可能な設定のリストが表示されます。

注: 自動生成されたプロキシクライアントも、デフォルトでMaxBufferSizeを65536に設定します。


8
なぜああ、なぜ私はいつもこれを忘れるのですか?+1
James Skemp

9
vs2013では、SvcConfigEditorは、WCF構成の編集で置き換えられています。
ZoomVirus

SVCconfigEditorが見つかりませんか?
Arul Sidthan 2014

Bindingsフォルダーの下にあり、サービスのバインディングをクリックするとそこに表示されます。
Sameer Alibhai、2015

構成ファイルが自動生成されている場合は、絶対にこの方法で行う必要があります。参照を更新するたびにapp.configが再生成されるため、手動で再度変更する必要があります。ただし、それをVSに変更した場合、新しい変更は選択した設定に対応します。
kingfrito_5005 2015

104

WCFバインディングを動的に作成する場合、使用するコードは次のとおりです。

BasicHttpBinding httpBinding = new BasicHttpBinding();
httpBinding.MaxReceivedMessageSize = Int32.MaxValue;
httpBinding.MaxBufferSize = Int32.MaxValue;
// Commented next statement since it is not required
// httpBinding.MaxBufferPoolSize = Int32.MaxValue;

初期化して使用できます。明らかに、これをコンストラクターメソッドで使用できます。
aemre 2017

45

WCFテストクライアントそれ自身のクライアントの設定を持っています。

テストクライアントを実行し、一番下までスクロールします。構成ファイルノードをダブルクリックすると、XML表現が表示されます。あなたが見ることができるようmaxReceivedMessageSizeです65536

これを編集するには、[構成ファイル]ツリーノードを右クリックし、[編集]を選択します。 SvcConfigEditor。エディターが開いたら、「バインディング」を展開し、自動的に生成されたバインディングをダブルクリックします。

ここを含むすべてのプロパティを編集できますmaxReceivedMessageSize。完了したら、[ ファイル ] - [ 保存 ]をクリックします

最後に、WCFテストクライアントウィンドウに戻ったら、[ ツール ] - [ オプション ]をクリックします

サービスの起動時に[常に再構成する]チェックボックスをオフにします


2
おそらくここで最良の答えです!
Haris

3
Always regenerate configオプションのチェックを外すというメモのために賛成票を投じます。
furier

私の意見では最も簡単な解決法です。頭痛を和らげてくれました。
Jared Beach

vs2013では、SvcConfigEditorは、WCF構成の編集で置き換えられています。
ZoomVirus

ありがとうございました。問題がテストクライアントの構成にあったときに、しばらくの間、サーバー構成を何度も変更しました。
Fahad

24

簡単な方法を見つけた

--- webconfigまたはapp configファイルを右クリックし、[WCF構成の編集]をクリックして、bingdigs ans select yoreサービスにアクセスし、右側にmaxReciveMessageSizeに大きな数を表示します---


2
すばらしい回答でした。ここから編集できることを知りませんでした。ありがとう
albert sh

8

私は問題を解決します...次のように

    <bindings>
  <netTcpBinding>
    <binding name="ECMSBindingConfig" closeTimeout="00:10:00" openTimeout="00:10:00"
      sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
      maxReceivedMessageSize="2147483647" portSharingEnabled="true">
      <readerQuotas maxArrayLength="2147483647" maxNameTableCharCount="2147483647"
          maxStringContentLength="2147483647" maxDepth="2147483647"
          maxBytesPerRead="2147483647" />
      <security mode="None" />
    </binding>
  </netTcpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="ECMSServiceBehavior">
      <dataContractSerializer ignoreExtensionDataObject="true" maxItemsInObjectGraph="2147483647" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceTimeouts transactionTimeout="00:10:00" />
      <serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="100"
        maxConcurrentInstances="100" />
    </behavior>
  </serviceBehaviors>
</behaviors>

20
これは私のソリューションとどう違うのですか?あなた以外に、構成の関連性のない部分と関連する部分をすべて含め、選択した200mではなく、可能な最大値を選択しましたか?
ネイト

3
コンテキストも良いです...多分これらの2つの答えはマージできますか?
Jeff

1
その設定はサーバーまたはクライアントで構成されますか?
ジョンケネディ2011

8

CalculateRoute()を使用して、プロジェクトのBing Maps WPFに関する問題を解決しました。私の場合の解決策は、「customBinding」セクションの属性「httpTransport」にmaxReceivedMessageSizeおよびmaxReceivedMessageSizeを設定することでした。

私はapplications.configファイル(例えばmyApp.config)にこの設定を設定しました:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IGeocodeService" />
            <binding name="BasicHttpBinding_IRouteService" />
        </basicHttpBinding>
        <customBinding>
            <binding name="CustomBinding_IGeocodeService">
                <binaryMessageEncoding />
              <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                                maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
                                bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
                                keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
                                realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                                useDefaultWebProxy="true" />
            </binding>
            <binding name="CustomBinding_IRouteService">
                <binaryMessageEncoding />
              <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                                maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
                                bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
                                keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
                                realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                                useDefaultWebProxy="true" />
            </binding>
        </customBinding>
    </bindings>
    <client>
        <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGeocodeService"
            contract="BingServices.IGeocodeService" name="BasicHttpBinding_IGeocodeService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc/binaryHttp"
            binding="customBinding" bindingConfiguration="CustomBinding_IGeocodeService"
            contract="BingServices.IGeocodeService" name="CustomBinding_IGeocodeService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IRouteService"
            contract="BingServices.IRouteService" name="BasicHttpBinding_IRouteService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/binaryHttp"
            binding="customBinding" bindingConfiguration="CustomBinding_IRouteService"
            contract="BingServices.IRouteService" name="CustomBinding_IRouteService" />
    </client>
</system.serviceModel>

6

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding_Username" maxReceivedMessageSize="20000000"          maxBufferPoolSize="20000000">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" establishSecurityContext="false"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<client>
  <endpoint
            binding="wsHttpBinding"
            bindingConfiguration="wsHttpBinding_Username"
            contract="Exchange.Exweb.ExchangeServices.ExchangeServicesGenericProxy.ExchangeServicesType"
            name="ServicesFacadeEndpoint" />
</client>


あなたの答えを投稿するのに最適です。「bindingConfiguration」の値がバインディング名と一致することが重要です。あなたの例では「wsHttpBinding_Username」です。
Bruno Bieri

6

以下のためのHTTP:

<bindings>
  <basicHttpBinding>
    <binding name="basicHttp" allowCookies="true"
             maxReceivedMessageSize="20000000" 
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
        <readerQuotas maxDepth="200" 
             maxArrayLength="200000000"
             maxBytesPerRead="4096"
             maxStringContentLength="200000000"
             maxNameTableCharCount="16384"/>
    </binding>
  </basicHttpBinding>
</bindings>

以下のためのTCP:

<bindings>
  <netTcpBinding>
    <binding name="tcpBinding"
             maxReceivedMessageSize="20000000"
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
      <readerQuotas maxDepth="200"
           maxArrayLength="200000000"
           maxStringContentLength="200000000"
           maxBytesPerRead="4096"
           maxNameTableCharCount="16384"/>
    </binding>
  </netTcpBinding>
</bindings>

重要:

多数のオブジェクトが接続されている複雑なオブジェクト(例:ツリーデータ構造、多数のオブジェクトがあるリスト...)を渡そうとすると、割り当てをどのように増やしても通信は失敗します。このような場合、含まれているオブジェクトの数を増やす必要があります。

<behaviors>
  <serviceBehaviors>
    <behavior name="NewBehavior">
      ...
      <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

これmaxItemsInObjectGraphが(迅速な)解決策でした。ただし、これを増やすときは、リソースに負担をかける可能性がある巨大なオブジェクトグラフとは対照的に、アプリケーションがチャンクでデータを要求するためのより良い解決策であるかどうかを検討する必要があります。
Paul

6

私にとってはmaxReceivedMessageSize="2147483647"、クライアントapp.configに追加するだけです。サーバーはそのままです。


5

私の経験から考慮すべきもう1つの重要なこと..

maxBufferPoolSizeを最大化しないことを強くお勧めします。プールからのバッファーは、アプリドメイン(つまり、アプリケーションプール)がリサイクルされるまで解放されないためです。

トラフィックが多い期間は、大量のメモリが使用され、解放されない可能性があります。

詳細はこちら:


3

実行エントリポイントのapp.configが考慮されることを忘れないでください。クラスライブラリプロジェクトにあるWebサービスの呼び出しを管理するものではありません。

たとえば、単体テストの実行中にエラーが発生した場合は、テストプロジェクトで適切な構成を設定する必要があります。


0

web.configでこの設定を使用すると、このエラーが発生しました

System.ServiceModel.ServiceActivationException

私はこのように設定します:

      <service name="idst.Controllers.wcf.Service_Talks">
    <endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_TalksAspNetAjaxBehavior"
      binding="webHttpBinding" contract="idst.Controllers.wcf.Service_Talks" />
  </service>
  <service name="idst.Controllers.wcf.Service_Project">
    <endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_ProjectAspNetAjaxBehavior"
      binding="basicHttpBinding" bindingConfiguration="" bindingName="largBasicHttp"
      contract="idst.Controllers.wcf.Service_Project" />
  </service>
</services>

<bindings>
<basicHttpBinding>
    <binding name="largBasicHttp" allowCookies="true"
             maxReceivedMessageSize="20000000"
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
        <readerQuotas maxDepth="32"
             maxArrayLength="200000000"
             maxStringContentLength="200000000"/>
    </binding>
</basicHttpBinding>


4
だから、あなたはネイトの答えを使って問題を修正し、それを自分のものとして投稿した。クールではありません。
Arcain 2013年

@arcain Natesの回答は非常に一般的であり、頻繁に登場すると予想される株式の名前と番号を使用しています。この答えは盗まれたのではなく、単に正しい答えです。正解は1つしかないので、繰り返す必要がありました。
kingfrito_5005 2015

@ kingfrito_5005回答者が投稿したとき、「正しい」答えはすでにここにありました。彼はかなり明確にネイトのbindings要素を持ち上げ、彼の答えの一部としてそれを再投稿しました。これらの2000000値はかなり異なります。
2015

@arcain、私はそれらが非常に標準的な値であることに同意しません。私の会社はバインディング要素でもそれらを使用しています。
kingfrito_5005 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.