0

私はEFと組み合わせてWCFで遊んでいて、コレクションの送信で問題が発生しました。

私は2つのソリューションで構成される遊び場で作業していますが、回線を介して通信するために必要な最低限のことです。2つの間で文字列を送信することは問題なく機能し、クライアントを介してデータベースにレコードを追加することも問題なく機能します。ただし、私のサービスは次の契約を公開しています。

[OperationContract]
IEnumerable<Company> GetAllCompanies();

次のような私のサービスに実装されています:

public IEnumerable<Company> GetAllCompanies()
{
    using (var ctx = new InleerAppContext())
    {
        return ctx.Company.ToList();
    }
}

異常なことは何もありません。オブジェクトの送信は正常に機能しているように見えたので、これも機能すると予想していました。ただし、クライアントからGetAllCompanies()を呼び出す場合:

var result2 = service.GetAllCompanies();
foreach (Company c in result2)
{
    Console.WriteLine(c.Name);
}

CommunicationExceptionがスローされます:

http:// localhost:8080/へのHTTP応答の受信中にエラーが発生しました 。これは、HTTPプロトコルを使用していないサービスエンドポイントバインディングが原因である可能性があります。これは、サーバーによってHTTP要求コンテキストが中止されたことが原因である可能性もあります(おそらくサービスのシャットダウンが原因です)。詳細については、サーバーログを参照してください。

いくつかの詳細情報:

System.Net.HttpWebRequest.GetResponse()
でSystem.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpanタイムアウト)で

カスタムバインディング構成(両側のbasicHttpBinding)を使用して、クライアントとサーバーの両方でタイムアウトを30分に変更しました。

<bindings>
  <basicHttpBinding>
    <binding name="longTimeoutBasicHttpBinding"
             receiveTimeout="00:30:00" 
             sendTimeout="00:30:00">          
    </binding>
  </basicHttpBinding> 
</bindings>

ここで何が欠けていますか?

4

2 に答える 2

2

おそらく循環参照に問題があります。WCFがCompanyインスタンスをシリアル化しようとすると、すべてのプロパティにアクセスするため、関連するエンティティの遅延読み込みがトリガーされ、それもシリアル化されますが、エンティティに後方ナビゲーションプロパティがある場合は、それに続き、会社を再度シリアル化します=>シリアライザーは無限ループにあります。

これを解決する方法は2つだけです。

  • 遅延読み込み(またはプロキシ全体の作成)をオフにします-を使用しますctx.ContextOptions。また、との関係をロードしないでくださいInclude
  • 循環依存の削除/解決-これは、リレーションもシリアル化する場合に必要です
于 2011-08-10T12:30:19.023 に答える
0

これは通常、セラライザーがクラスに問題を抱えているときに発生します。たとえば、会社がエンティティオブジェクトであり、ナビゲーションプロパティの1つをセラライズしようとしている場合、それは機能しません

于 2011-08-10T12:13:43.883 に答える