2011-01-29 10 views
2

愚かなエラーの種類が、私は、サーバー側サービス(WCF二重)で、クライアントを呼び出すために望んでいたとき、これが起こっ:WCFコールバックのタイムアウトとVisual Studioの致命的な故障

メッセージが内に転送することができませんでした00:01:00の割り当てられたwcfコールバックタイムアウト、信頼できるチャネルの転送ウィンドウに利用可能なスペースがありませんでした

また何かmysterious happened too。ログインメソッドで、ユーザーとパスワードが間違っている場合にサービスを呼び出したときに、送信者コールバックを見つけて、送信者にGetErrorメソッドを呼び出して、「ユーザーが間違っています」などの論理エラーを表示します。これはうまくいきますが、ユーザーとパスワードが正しい場合にアクセスできれば、エラーが発生します(他のすべてのクライアント側のメソッドと同じ - これらのメソッドでは単純な文字列より多くのデータを送信します。

編集2:ほとんどのコールバックメソッドでは、データコンテキスト(LINQ to SQL)データクラス(リストまたは単一行)のようなデータを送信しました。これは私の問題かどうかです!
(しかし、これはまた、コールバックメソッドにおける送信データ構造体で、WCF二重を使用して、私の最初の時間ではありませんが、私は驚異的だ。)また、そのエラーの後、私は、

でこのエラーを得た

スクリーンサービスhttp://server:15450/service.svc致命的な障害からの要求を処理することができませんでし

編集3: サービスの設定:

<system.serviceModel> 
    <services> 
     <service name="ContactServer.Business.ContactService" 
       behaviorConfiguration="ServiceBehavior"> 
     <endpoint address="" 
        binding="wsDualHttpBinding" 
        contract="ContactServer.Business.IContactService"> 
      <identity> 
      <dns value="localhost"/> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" 
        binding="mexHttpBinding" 
        contract="IMetadataExchange" 
        name="MexBinding"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

クライアントコンフィグ

<system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_ContactService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" 
      textEncoding="utf-8" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
      <security mode="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
       algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:1408/ContactService.svc" 
     binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_ContactService" 
     contract="ServiceReference.ContactService" name="WSDualHttpBinding_ContactService"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 

詳細情報:私は、.NET 3.5とVisual Studio 2010を使用するには、クライアント側の立ち上がりタイムアウト後、私はまだ同じエラー、with 00:01:00 Timeを得ました。なぜこれが起こったのですか?

+2

@Rev:このストーリーは素晴らしいですが、サービスやコールバックの動作、サービスとコールバックの契約など、サービスに関する詳細情報が必要です。クライアントアプリケーションのタイプについても。 Btw。 DataContextをWCF経由で送信しないでください。動作しません。 –

+1

多分、WPFまたはSilverlightで有名な問題があります。ここでConcurrencyMode = Reentrantを指定する必要があります。 – vorrtex

+0

@ラディスラフ:私はサービスまたはコールバック全体のデータコンテキストを送信せず、1つまたは2つのデータクラス(単一の行またはリスト)のみを送信します。 – Rev

答えて

2

問題は、WCFサービスからのエンティティの転送に関する問題です。 enter image description here

Entity Frameworkの:

public Item GetItem(int id) 
    { 
     var se = new SampleEntities(); 
     return se.Items.FirstOrDefault(i => i.Id == id); 
    } 

コードが間違っていないようですが、実際にそれがでアイテムを返します。例えば、私たちは、このデータベース・モデルを

を持っています関連するすべての項目。

 var s = new SampleServiceClient(); 
     var item = s.GetItem(1); 
     Assert.AreEqual(item.RelatedItems.Any(), true); //equal 

データベースに多対多の関係があると、特に危険です。 だから、遅延読み込みを無効にする必要があります(あなただけのリターンの前にそれらを無効にすることができます):

var se = new SampleEntities(); 
se.ContextOptions.LazyLoadingEnabled = false; 
return se.Items.FirstOrDefault(i => i.Id == id); 

LINQのSQL

public Item GetItem(int id) 
    { 
     var dc = new DataClasses1DataContext(); 
     return dc.Items.FirstOrDefault(i => i.Id == id); 
    } 

我々は例外があります。

をがありましたパラメータをシリアル化しようとしているときにエラーが発生しました:GetItemResult。 InnerExceptionメッセージは 'WebApplication1.RelatedItem'タイプのオブジェクトグラフにサイクルが含まれており、参照トラッキングが無効な場合はシリアル化できません。 '

DataContext図を開き、[プロパティ] - > [シリアル化モード] - > [無方向性]を設定する必要があります。 Hereより完全な説明です。

+0

DataContextから確かに問題が起きます – Rev