2011-08-10 6 views
0

私はEFと連携してWCFで遊んでいて、コレクションを送信中に問題が発生しました。WCFコレクションを取得しようとするとクライアントがクラッシュする

私は2つのソリューションで構成されたプレイグラウンドで作業していますが、私はそのライン上で通信する必要があります。クライアント間でデータベースにレコードを追加すると、2つの間で文字列を送信しても問題ありません。普通のとオブジェクトを送信して以来、何も私はこれが動作するように期待ただろう正常に動作するように見えたん

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

:よう

私のサービスで実装
[OperationContract] 
IEnumerable<Company> GetAllCompanies(); 

:しかし、私のサービスは、次の契約を公開しますあまりにも。私のクライアントからGetAllCompanies()を呼び出すとき はしかし、:

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

Aて、CommunicationExceptionがスローされます: http://localhost:8080/にHTTPレスポンスを受信して​​いる間

エラーが発生しました。これは、サービスエンドポイント がHTTPプロトコルを使用していないためです。これは、HTTP 要求コンテキストがサーバーによって中止されたためです( サービスがシャットダウンしている可能性があります)。詳細はサーバーログを参照してください。 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpanの タイムアウト)でSystem.Net.HttpWebRequest.GetResponseで

()

:いくつかのより多くの情報を

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

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

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

+0

あなたが一つの会社を返すとどう関係をシリアライズしたい場合は?会社にナビゲーションのプロパティはありますか?会社は動的なプロキシで包まれていますか?遅延読み込みを使用していますか? –

+0

configのエンドポイント情報を送信できますか? – Iain

+0

このリンクをチェックするhttp://www.devlifestyle.net/blogs/articles/archive/2009/12/23/parsing-large-messages-in-wcf-maxitemsinobjectgraph-maxreceivedmessagesize-and-maxbuffersize.aspx – VJAI

答えて

2

ほとんどの場合、循環参照に問題があります。 WCFがCompanyインスタンスをシリアル化しようとすると、それはすべてのプロパティに触れるので、関連するエンティティの遅延読み込みがトリガされてシリアル化されますが、逆方向のナビゲーションプロパティを持つエンティティの場合は、それに追随して会社を再度シリアル化します。>シリアライザは無限ループ。

それを解決する唯一の方法は2つあります。

    は、遅延ローディング(または全体のプロキシの作成)をオフにし
  • - ctx.ContextOptionsを使用しています。またInclude
  • Remove/solve circular dependencyとの関係をロードしていない - これは必要であるあなたにも
+0

もう一度よくお返事ありがとうございます。私は最後の数日をたくさん学びました。 GetCompanyは次のようになります。 ctx.ContextOptions.ProxyCreationEnabled = false; return ctx.Company.Include( "PhoneNumbers")。ここで(company => company.Id == id).FirstOrDefault(); 今、データは、ライン上でうまく伝わり、NavigationProertyが含まれています。私は助けることができませんが、私はちょうどこの方法で何かをハッキングしていると感じています。これは良い練習ですか? – duress

+0

WCF環境でいつでもPrexyCreationを避け、DTOを使用する必要がありますか?私のテンプレートに[IgnoreDataMember]でシリアライズする必要のないプロパティを飾ることができるので、この設定ではDTOの付加価値はどのようになっていますか? – duress

0

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

関連する問題