2016-08-06 2 views
0

XMLデータを読み取っているときに「最大限の文字数制限(16384)を超えました...」というエラーメッセージが表示されます。ポジション435。商用SOAP Webサービスへの呼び出しでしかし、返される実際のデータは、あらゆる種類のカウントを超えているわけではありません。完全に有効なXMLの2kであり、行3または他の行に文字435はありません。エラーメッセージは意味をなさない。.Net 4.6サービス参照呼び出しで「最大文字数制限値」のエラーが発生する

私はstackoverflowでこのエラーメッセージに関する他の質問を見ましたが、エラーが実際に何を意味しているのかは一般的にわかりますが、問題の長さ制限を上げるのが正しい解決策です。それはここでは当てはまりません。

背景:当社のウェブアプリケーションは、商用ベンダーのWebサービスを使用して支払いを処理しています。私たちがインターフェースを定義するために使ったWSDL/XSDの仕様は、現在では多くのバージョンが古くなっていますが、まだ動作しています。現在のWSDLとXSDを使用しようとしているので、最近の機能を利用することができます。しかし、現代のレイアウトからサービスインタフェースを再生成すると、それはもはや機能しません。XML解析の例外に包まれた「最大限の文字カウント」エラーが生成されます。

苦労して、IClientMessageInspectorクラスをサービスに添付して、SOAPリクエストとレスポンスの内容を記録することができました。あなたは、応答が、構文解析できなかったひどく形作られたサーバーエラーメッセージではなく、成功したトランザクションを示す簡潔で単純なXML応答であることがわかったときに私がどんなに困惑しているのか想像してもらえます。受信する。

最後に、Visual Studioの分解デバッグを使用して、エラーがスローされた場所にステップインし、実際にどのような入力が失敗しているのかを確認しようとしましたが、Visual Studioはそれをスキップし続けますコード - それは "自分のコード"がオフになっているにもかかわらず、それを踏み越えることを拒否します。

内部例外のスタックトレースを読み取ります

at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) 
at System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, XmlSerializer serializer, MessagePartDescription returnPart, MessagePartDescriptionCollection bodyParts, Object[] parameters, Boolean isRequest) 

at System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader, String res, String arg1, String arg2, String arg3) 
at System.Xml.XmlExceptionHelper.ThrowMaxNameTableCharCountExceeded(XmlDictionaryReader reader, Int32 maxNameTableCharCount) 
at System.Xml.XmlBaseReader.QuotaNameTable.Add(Int32 charCount) 
at System.Xml.XmlBaseReader.QuotaNameTable.Add(String value) 
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderITransactionProcessor.InitIDs() 
at System.Xml.Serialization.XmlSerializationReader.Init(XmlReader r, XmlDeserializationEvents events, String encodingStyle, TempAssembly tempAssembly) 
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) 

これは言うと、InvalidOperationExceptionに包まれているが、このトレースに「XMLドキュメント(3、436)にエラーがあります」

となり、「操作 'xxxx'に対する応答メッセージの本体を逆シリアル化する際にエラーが発生しました」というCommunicationExceptionがラップされます。

私はどのように進むべきかわかりません。私は、エラーメッセージを分析可能なものに接続することはできません。何が原因でしょうか?

+0

であるあなたは値を大きくしようとしたことがありバインディングのReaderQuotasのMaxNameTableCharCountについては? Int32.Maxまでかかります。新しいバージョンのサービスでは、この問題の原因となっているメソッドと名前空間が追加されている可能性があります(半教育の推測のみ)。 – Tim

+0

mondayを試してみましょう...もしそれが解決策なら、実際に解析しているものが何であるか疑問に思います。私は最初に、何らかの理由でこれがサーバー上に設定されていなければならないという声明のために試してみた。両者が.netクラスであれば問題はないと思うが、問題ではないはずだ一般的なバニラSOAPで –

+0

@Tim Okay、それは実際に働いた。私はそれを16kから64kにぶつけ、エラーはもはやありません。それでも、返されたXMLも、私が見ることができるメタデータも、3行目の位置345のようなものはありません。また、16kを超える別個の要素を持つものは何も見つかりません。それは(xsdは大きいですが、その中の名前の総数は4kのようにしかありません)。多分それは名前の長さを数えています。 とにかく、本当の答えとしてあなたの提案を書いたら、私はあなたに信用を与えます。 –

答えて

1

は設定で、クライアント側でmaxNameTableCharCountを増やし:

<readerQuotas maxDepth="32" 
       maxStringContentLength="5242880" 
       maxArrayLength="16384" 
       maxBytesPerRead="4096" 
       maxNameTableCharCount="5242880"/> 

リーダーのクォータの設定はクライアントだけ(またはサービス)に適用されます - 基本的にはどちらの側にはその設定を使用しています。大型化が必要な理由

のXSDの大きさであってもよい - MSDNのドキュメントには、そのプロパティが何をするかを明確に本物ではないので、これは半推測:)

+0

Man、MSDNのドキュメントは非常に怒っているかもしれませんが、このブログの投稿に影響を与えました:https://supersonicman.wordpress.com/2016/08/06/pseudo-documentation/ –

関連する問題