web-dev-qa-db-ja.com

WCFmaxReceivedMessageSizeが構成から読み取られていません

WCFサービス用に次のサーバー側app.configがあります。

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="default" maxReceivedMessageSize="5000000">
          <readerQuotas maxStringContentLength="5000000" maxArrayLength="5000000" />
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="Core.TOAService.Service1Behavior"
        name="Core.TOAService.TOAService">
        <endpoint address="" binding="wsHttpBinding" contract="Core.TOAService.ITOAService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <Host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/Core.TOAService/TOAService/" />
          </baseAddresses>
        </Host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Core.TOAService.Service1Behavior">
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

このサービスに大きなファイル(約250KBのみ)を渡そうとすると、svclogファイルに例外が記録されます。

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

構成の上部にあるバインディングセクションからわかるように、maxReceivedMessageSizeを5000000に設定しようとしましたが、サービスはそれでもデフォルトの65536に設定されていると見なします。何が間違っているか、またはどれが「適切」であるかに関するアイデア「バインディング要素?

16
Colin Desmond

その他の設定があります:-)<binding>タグで「maxBufferPoolSize」と「maxBufferSize」を試してください。

しかし、最大の問題は次のとおりです。エンドポイントはnotそのバインディング構成を参照します!

<endpoint address="" 
          binding="wsHttpBinding" contract="Core.TOAService.ITOAService">

役立つように、参照を追加する必要があります。「デフォルト」と呼ぶだけでは機能しません。

<endpoint address="" 
          binding="wsHttpBinding" 
          bindingConfiguration="default"
          contract="Core.TOAService.ITOAService">

あなたは時代を先取りしています;-) WCF 4(.NET 4.0を使用-2009年後半のいつか)では、明示的に名前を付けて参照しなくても「デフォルトのバインディング構成」を定義できますが、今のところは、エンドポイントとそのバインディング、およびバインディング(または動作)構成の間にリンクを作成する必要があります!

マーク

28
marc_s

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

問題を修正するには:

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

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

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

16

サイズを設定する必要がある場所がいくつかあります。あなたの場合、読み取りクォータを追加する必要があると思います。次に例を示します。

  <basicHttpBinding>
    <binding name="httpBasicBinding_Service" closeTimeout="00:03:00"
      openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00"
      maxBufferSize="2000001"
      maxBufferPoolSize="2000001" maxReceivedMessageSize="2000001">
      <readerQuotas maxDepth="2000001" maxStringContentLength="2000001"
        maxArrayLength="2000001" maxBytesPerRead="2000001" maxNameTableCharCount="2000001" />
    </binding>
  </basicHttpBinding>
1
Shiraz Bhaiji