web-dev-qa-db-ja.com

XML文字列をWCFに送信中に「XMLデータの読み取り中に最大文字列コンテンツ長の割り当て(8192)を超えました」エラー

さらに操作するために、長いXML文字列をWCFサービスメソッドに送信する.NET、C#アプリケーションを使用しています。アプリケーションが実行時にXML文字列をWCFサービスに送信しようとすると、エラーメッセージが表示されます。

"The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:strProdUserDataXML. The InnerException message was 'There was an error deserializing the object of type System.String. The maximum string content length quota (8192) has been exceeded while reading XML data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader. Line 131, position 57.'. Please see InnerException for more details."

アプリケーション側のweb.config「バインディング」と「エンドポイント」を次のように記述しました。

<binding name="EndPointHTTPGenericPortal" closeTimeout="01:00:00" openTimeout="01:00:00" receiveTimeout="01:00:00" sendTimeout="01:00:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    <security mode="None">
    <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
    </binding>

    <endpoint address="http://192.168.140.40/WcfGenericPortal_Service/Service1.svc" binding="basicHttpBinding" bindingConfiguration="EndPointHTTPGenericPortal" contract="IService1" name="EndPointHTTPGenericPortal" behaviorConfiguration="Graph" />

このエラーの解決方法を教えてくれる人がいれば、私は非常に義務付けられます。よろしくお願いします。

18
Pinaki Karuri

これは、MSDNの Reader Quotas に関する記事です。

サーバー側のリーダークォータの1つを超えているようです。

具体的には、maxStringContentLengthを超えています。デフォルト値は、8192文字(maxStringContentLengthの場合)で、エラーメッセージの説明を超えています。

しかし、他の人が示唆しているように、すべての値を最大値2147483647に増やすだけでは、最善のアプローチとは言えません。

リンクしたMSDNドキュメントに記載されているとおり:

複雑さの制約により、メッセージの複雑さを使用してエンドポイントの処理リソースを拘束しようとするサービス拒否(DOS)攻撃から保護されます。その他の複雑さの制約には、メッセージ内の文字列コンテンツの最大要素深度や最大長などの項目が含まれます。

現在Security ModeNoneに設定されているという事実と相まって、いくつかの問題に備えている可能性があります。

10
Derek W

このエラーが発生し、クライアントとサーバーの両方の構成でサービスのthis-MaxItemsInObjectGraphプロパティを追加して解決しました。

<dataContractSerializer maxItemsInObjectGraph="2147483647" />

サーバ側

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior name="Service.Service1Behavior">
        <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      </behavior>
</system.serviceModel>

クライアント側

<behaviors >
  <endpointBehaviors>
    <behavior name="endpointbehaviour">
      <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
    </behavior>
  </endpointBehaviors>
</behaviors>

この動作をEndPoint behaviorConfiguration = "endpointbehaviour"に適用することを忘れないでください

8
Lingaraj

クライアント側バインディング

    <system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService11" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"
messageEncoding="Text">
<readerQuotas maxDepth="128" maxStringContentLength="2147483647"
maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>

<behaviors>
<endpointBehaviors>
<behavior name="KAMServiceDistributor">
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="http://localhost:1234/xxxx/Service.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService11"
contract="yourservice namespae" name="AnyName" />
</client>
</system.serviceModel>

サービス構成ファイル:

<system.serviceModel>
<behaviors>


<serviceBehaviors>
<behavior name="ServiceBehaviour">
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceMetadata httpGetEnabled="true" />
<dataContractSerializer ignoreExtensionDataObject="false" maxItemsInObjectGraph="2147483646" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding <b>maxReceivedMessageSize="2147483647"</b>>
<readerQuotas maxDepth="128" maxStringContentLength="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="ServiceBehaviour" name="Service">
<endpoint binding="basicHttpBinding" contract="IService" />
</service>
</services>
</system.serviceModel>
6

バインディングで次のものを設定してみてください。

<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
    maxArrayLength="2147483647" maxBytesPerRead="2147483647"
    maxNameTableCharCount="2147483647" />

それは私の問題を解決しました。詳細については、次のリンクを参照してください http://blogfornet.com/2013/08/the-maximum-string-content-length-quota-8192-has-been-exceeded-while-reading-xml-data/

5

ピナキカルリ、

クォータの長さは、クライアントの構成だけでなく、サーバーの構成にも依存します。 WCFサーバーのweb.configを投稿して、問題の一部を解明してください。 8192のクォータが既に設定されている可能性があるため、最も早い方法はその値を見つけて増やすことです。

更新

私が見る限り、サーバーのweb.configに 'readerQuotas'ノードがないため、MaxStringContentLengthの値はデフォルト(8192)。詳細については、このリンクを参照してください: http://msdn.Microsoft.com/en-us/library/system.xml.xmldictionaryreaderquotas.maxstringcontentlength.aspx

5
Piotr Justyna

クライアントのターゲットフレームワークがサービスのターゲットフレームワークと同じであることを確認します。私はこの問題を抱えており、上記の修正をすべて試しましたが、うまくいきませんでした。プロパティをチェックし、ターゲットフレームワークをチェックして変更しました。

0
Luigi