2011-08-26 830 views
45

正常に動作しているWCF Webサービスがあります。しかし、失敗している特定の呼び出しがありますが、特定のユーザーだけが失敗します。この呼び出しはかなりシンプルです。これは、Personオブジェクトのリストを取得するための呼び出しです。既存の接続がリモートホストによって強制的に閉じられました - WCF

ユーザーAにとっては問題ありません。サービスはデータベースに照会し、Personオブジェクトのリストを作成し、呼び出し元のアプリケーションに戻します。

ユーザーBの場合は失敗します。奇妙なことは、私がデバッグすると、サービスは正常に動作しているようです。データベースに問い合わせることができ、Listオブジェクトを作成して返します。サービス自体は決して失敗しません。しかし、クライアントアプリケーションは、 "既存の接続はリモートホストによって強制的に閉じられました"というエラーを受け取ります。

私には、サービス層がXML形式のデータをパッケージ化して呼び出し元のアプリケーションに送り返そうとしているときに、何かが起きているようです。私は、コールが他のユーザにとってうまく働くので、データに関連する問題でなければならないと考えています。私は視覚的にデータを見て、私は奇妙なものは実際には見ません。 1つの推測では、ユーザーBのデータにはファンキーな隠れた文字などがあるため、サービスが予期せず終了する原因となります。そんな感じ。

アイデア?

+0

サービスがクライアントから呼び出されている間にサーバーからWebサービスアプリケーションを削除していた可能性があります。エラーログにこのエラーがあります。 – xameeramir

答えて

71

このようなことを診断するために私が見つけた最良のものは、サービストレースビューアです。それは(あなたがコンフィグを編集することができます仮定)を設定する非常に簡単です:

http://msdn.microsoft.com/en-us/library/ms732023.aspx

は、この情報がお役に立てば幸いです。

+12

これが助けになりました。私も同様の問題がありました。私の場合、ServiceTraceViewerは列挙型の値をシリアル化しようとしている間に例外がスローされることを示しました。操作では、この列挙型を含むオブジェクトを最初に初期化せずに戻そうとしましたが、列挙型の定義にはデフォルト値(0)のメンバーがありませんでした。だから、0をシリアル化できませんでした。 –

+0

私はこれを行い、問題を特定することができました。私の場合は、クライアントへのシリアル化中にNullReferenceExceptionが発生しました。ここで私が知りたいことがあります:なぜ、この接続の問題に私の元の例外が埋め込まれていたのですか?それは内部の例外のどれでもなかったが、それは問題の原因であった。これは遅れており、私はこれを克服する方法を考え出す必要があります。私は新しい質問idkを投稿するかもしれない... – toddmo

11

私はこれを一度見ました。ユーザーが異なる量のデータを要求していますか?データペイロード(つまりmaxReceivedMessageSize)のバインディングを設定できる場合でも、httpRuntimemaxRequestLengthはWCF設定よりも優先されるため、IISがそれを超える要求を処理しようとすると、この動作を示します。このようなことの

考える:maxReceivedMessageSizeは、あなたのWCFの行動の12メガバイトで、maxRequestLength

場合は、4メガバイト(デフォルト)で、IISが勝利します。

+2

それはそれだとは思わない。私はそれを減らすために返されたデータを修正しようとしたが、うまくいかなかった。通常のクエリは63行を返します。私は1行だけ戻すように変更しましたが、それでも失敗します。ユーザーAのデータは26行を返し、正常に動作します。ユーザーBのデータを1行だけ戻すように変更すると、まだ失敗します。非常に奇妙な。 –

22

ウェブサイトにSSLポートにバインドされた証明書がないため、この問題が発生しました。私はgooglewebのどこでもこの答えを見つけられなかったので、私はそれを言及すると思った、そしてそれを理解する時間がかかりました。イベントビューアには何も表示されませんでしたが、それは診断にとって非常に素晴らしいものでした。これは誰か他の誰かを救うことを望む。

6

私は唯一のサーバーになりました。このエラーが発生しましたし、溶液がmaxItemsInObjectGraph WCFのweb.configファイル内の属性 <behavior>下のタグを設定することでした:

<dataContractSerializer maxItemsInObjectGraph="2147483646"/> 
3

を私は、同じ例外をcatchedとでInnerException: SocketException.を発見しましたsvclogトレース

Windowsイベントログを調べた後、私はSystem.ServiceModel.Activation.TcpWorkerProcessクラスからのエラーを見ました。

netTcpBindingとポート共有を使用してIISでwcfサービスをホストしていますか?

fixを確認し、IISポート共有機能にバグがあるようです。

私のソリューションは、WindowsサービスであなたのWCFサービスをホストすることです。

+0

これは6のような古いバージョンのIIS用ですか? "修正"は2011年以降で、ダウンロードリンクもなくなっています。 –

3

私は同じ問題を抱えています。完全に役に立たないプロジェクトでLinQ2SQLを使用している場合

は、Visual StudioであなたのDBMLファイルを開き、次の6のような時間のために私の髪を引っ張った後

3

上に「単方向」シリアル化モードを変更します。私の解決策はこれですエラー、私の問題は、私のdata transfer objectsが複雑すぎるということに終わった。 public long Id { get; set;}のようなuberの単純なプロパティから始めましょう。

+1

私のオブジェクトには再帰的な参照がありました。 –

2

私が持っていた問題は、シリアル化でもありました。その原因は私のDTO /ビジネスクラスの一部であり、サービス参照を更新せずにプロパティの名前を変更または削除しました。私は代わりにcontract filter mismatch errorを得られなかったことに驚いています。しかし、サービスrefを更新すると、私のエラーが修正されました(OPと同じエラー)。

2

私の場合は、シリアル化されていました。シリアライゼーションに表示される可能性があるすべてのクラスに対して、 [KnownType(typeof(...)]を追加する必要があります。

7

返されたオブジェクトに、コンストラクタ(C#6.0構文)で初期化されたゲッターのみの自動プロパティがある場合、このエラーが発生することがあります。

これは、パラメータのないコンストラクタを使用してオブジェクトのプロパティを設定することで、クライアントサイドでオブジェクトを逆シリアル化するWCFが原因であると考えられます。 setが利用可能である必要があります。(それはプライベートにすることもできます)オブジェクトを埋める必要があります。それ以外の場合は失敗します。

+0

O ....私の....神様....この答えをどうもありがとう。私はなぜこれが言及されていないか、コンパイル時にキャッチされたのだろうか。 – DdW

関連する問題