-1

「Web クローリング」データを転送するための WCF を学習して動作させるのは、悪夢のような作業でした。

最初に、各呼び出しの後に接続を閉じたかどうかに関係なく、最初の接続/呼び出しの後にドットで 15 秒ごとに WCF 接続を閉じた追跡不可能なエラーを作成したのは GoDaddy のサーバーでした。これは、最終的に解決のためにGoDaddyに連絡したときに、可能なすべての解決策を使い果たした数週間後に解決されました. サーバーの移行後、この問題はなくなりました。

15 秒間の接続ドロップで数週間髪を抜いた後、別の追跡不可能なエラーが発生しました... 「基になる接続が閉じられました: 接続が予期せず閉じられました。」. この時点で、WCF をあきらめて、ASMX サービスに戻りました。

エラー: 「基になる接続が閉じられました: 接続が予期せず閉じられました。」は非常に一般的であり、ソリューションはさまざまであるため、診断/修正が困難です。トレース ログに jack が表示されず、何らかの理由で同じエラーがローカル マシンでは発生せず、サーバーでのみ発生します。このエラーを受け取ったときに、サーバー トレース ログにクライアント呼び出しが表示されませんでした。呼び出しがクライアントから WCF サービスに到達しなかったように..その上、クライアントのトレース ログには、「System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object)」エラー以外は何も表示されませんでした。助けて。

可能な解決策またはより意味のあるトレースを提供するための可能な方法として、オンラインですべてを試しましたが、運がありませんでした。役立つトレースログなしで、他の誰かがこれに遭遇しますか?

4

1 に答える 1

3

tl;dr: WCF でこのエラーが発生した場合の主な対処方法は、エラーが発生したときに Intelli-Sense タイプのデバッグ ウィンドウで虫眼鏡アイコン / XML として表示を試すことです。私の場合と同じように、エラーが公開される可能性があります。


最初は、ワイヤーに当たる前にクラス配列のシリアライゼーションが台無しになっていると思いました。配列は多数のオブジェクトを返し、一部はネストされているため、非常に可能性がありました。Xml.Serializer を使用してこの理論をテストし、返されたクラス配列を XML ドキュメントにシリアライズおよびデシリアライズしました。これは正常に機能し、クライアント側でエラーはスローされませんでした。ルールのシリアル化アウト。

次に、web.Config ファイルの設定の 1 つが正しく設定されていない可能性があると考えました。いいえ、すべてが正しいバインディング、動作、制限、タイムアウトで最大限に活用されました...すべてが良さそうに見えました。だから、おそらく複数の呼び出しを行っているので、同時実行またはスレッドの問題だと思いました。これをテストするために、シリアル化されたクラス オブジェクトの配列ではなく、リクエストごとに 1 セットの結果のみを返しました。またエラー出た!したがって、並行性やスレッドの問題ではありませんでした。

ただし、単一のクラス オブジェクトを返すことで解決に至りました。毎回 1 つのオブジェクトが失敗し続けることに気付きました... しかし、この 1 つのクラス オブジェクトは、(別のクラスの) 複数の文字列、整数、およびリストのコンテナーです。通常、返されるメイン クラスには 1000 を超えるサブオブジェクトはありません。しかし、このオブジェクトで返される何かに問題があることが明らかになりました。何を探すべきかわからないまま、すべての可能性(通常は 500 から 1000 の間)を調べることは、干し草の山の中の針のような問題です。

幸いなことに、「基になる接続が閉じられました: 接続が予期せず閉じられました」というエラーが表示されました。エラーがまだ表示されている間に、WCF サービスに送信されている List(Of Class) の上にマウスを置きました。これにより、クラス内の各サブオブジェクトを掘り下げながら、リスト (クラスの) 内の各クラスをふるいにかけることができる、Intelli-Sense タイプのデバッグ ウィンドウが表示されました。リスト(クラスの)で1つのクラスしか返さなかったので、物事を絞り込むのに役立ち、問題の原因となっている整数フィールドではないと想定しました-返される文字列変数に直行しました。それらをコピーしてメモ帳に貼り付けましたが、いくつかのサブオブジェクトが疑念を引き起こしましたが、すぐに気付いた問題は実際には見られませんでした. その後、好奇心によって、この intelli-sense タイプのデバッグ ウィンドウ内の各戻り文字列の横にドロップダウン矢印が付いた小さな虫眼鏡があることに気付きました。疑いのあるそれぞれの虫眼鏡をクリックすると、文字列を XML 形式で表示するオプションがあることに気付きました。私はこれをクリックして、長い間待っていましたが、意味のある文字列の 1 つでエラーが発生しました! エラーは、エスケープされていない & 記号が一部のテキストに混入していることを示していました。これがダメだと気づかなかったので、次の 5 文字 &、<、>、"、' をエスケープしました。再試行したところ、新しいエラーが発生しました。"XML ドキュメントで許可される最上位要素は 1 つだけです。リソースの処理中にエラーが発生しました" !@!

少し調査した後、このオブジェクトにはまだファンキーなものがあるように見えました。そこで、問題となる可能性のある文字列を<![CDATA[" & "]]>で囲んでみました。同じ「XML ドキュメントで許可される最上位要素は 1 つだけです。リソースの処理中にエラーが発生しました」というエラーが発生しました。{color:#000000;} の形式で CSS が抜け落ちていたことが判明しました。何らかの理由で、ブラケットが問題を引き起こしていました。その理由は、CSS の形式が JSON によく似ていて、クライアントがそれをそのように見ていたからだと推測しています。ブラケット/CSS を削除した後、「XML ドキュメントでは最上位の要素は 1 つだけ許可されています。リソースの処理中にエラーが発生しました」というメッセージが表示されなくなり、オブジェクトが正常に転送されました。

長い説明的な回答で申し訳ありませんが、有用なトレース情報をスローしなかったこれらの問題を抱えている人は他にいませんでした。うまくいけば、これは他の誰かに役立ちます!(私はここに投稿し、自分の質問に答えました。これは単純な解決策でしたが、解決するのが非常にイライラしたためです。)

于 2012-11-27T15:57:30.127 に答える