2011-12-14 13 views
0

私のSQLデータベースにアクセスするための方法として動作するWCFサービスがあります。 WCFサービスが何らかの理由でクラッシュするため、この部分はこの質問とはほとんど関係がなくなっています。または、少なくとも、クライアントSilverlightアプリケーションがクラッシュする原因になります。これが私があなたにそれについてあなたに尋ねるためにここに来る理由です。WCFサービスの非同期コールが正常に実行されない

コードは次のとおりです。それは私のSilverlightクライアントから非同期に呼び出されることに注意してください。終了すると、このメソッドから返された文字列がクライアントの画面に表示されます。

public string AddClients(IEnumerable<Client> newClients) 
    { 

     int nAdded = 0; 
     int nelse = 0; 
     string str = ""; 

     List<Client> newClientsList = newClients.ToList(); 
     List<Client> existingClients = dc.Clients.ToList(); 
     List<Client> clientsToAdd = new List<Client>(); 

     return newClientsList.Count.ToString(); 


     foreach (Client client in newClientsList) 

     { 
      var clt = existingClients.FirstOrDefault(c => c.ClientName == client.ClientName); 

      if (clt == null) 
      { 

       return clt.ClientName; 

       //str = str + " found: " + clt.ClientName + "\n"; 
       //dc.Clients.(clt); 

       //existingClients.Add(clt); 
       // clientsToAdd.Add(clt); 

       nAdded++; 
      } 
      else 
      { 
       nelse++; 
      } 
     } 

     if (nAdded > 0) 
     { 
      //str = str + " more than one nAdded"; 
      // dc.Clients.InsertAllOnSubmit(clientsToAdd); 
      // dc.SubmitChanges(); 
     } 

     return nelse.ToString(); 

    } 

あなたが起こってことになっているかを把握することができるかもしれないが、それのほとんどが原因、それは非常によく私のために働いていないという事実のために今起こっていません。

ご覧のとおり、かなり早い時期(foreachの前)にリターンがあります。彼らがいるように、それは大丈夫です。クライアントのボタンを押すと、コールが行われ、その後に戻ります。つまり、文字列として '3'が返されます(これはnewClientsのサイズで、パラメータです)。それは大丈夫です。少なくとも、サービスを接続できること、メッセージを返すこと、そして何を返すのかが証明されています。

私は、一番上のリターンを取り除くと、これは興味深い(よく問題のある)場所です。 if (clt==null)の条件でclt.ClientNameを返すか、末尾にあるnelse.ToString()を返す必要があります。

実際には何が得られますか?何もない。完了のためのメソッドは決して呼び出されないようです(メッセージボックスは表示されません)。

私はほとんどのものをコメントしました。確かに、これらの条件の1つに到達する必要があります!私はここで本当に明白な何かを逃したのですか?私は実際にこれを何年もの間デバッグしようとしてきましたが、何もありませんでした!誰かが私が見ることができない明白な何かを見ることができますか?

レコードの場合、 'dc'はデータコンテキストであり、dc.Clientsはクライアントエンティティのリストです。

+0

サーバーとクライアントの両方でWCFコードにブレークポイントを配置しようとしましたか?上記の方法のリターンはヒットしていますか?例外がスローされますか? Silverlightイベントハンドラが呼び出されますか? Silverlight AsyncCompletedEventArgs(e.Error)の例外はnullですか? –

+0

私はサービス内のポイントを破ることはできません(少なくとも、起動しません。クライアントアプリケーションプロジェクトの一部ではなく、IISでホストされています)。私は返されたエラーメッセージをチェックしませんでした。提案していただきありがとうございます。 – TheFaithfulLearner

+0

Nah、あなたはWCFコードにブレークポイントを置くことができます。私はいつもそれをする。ローカルIISサーバーで実行し、デバッガをアタッチしておくだけです。 WCFプロジェクトがクライアントコードと同じソリューションの一部である場合(これを行うことができれば私がお勧めします)、これは完全にシームレスです。 –

答えて

1

私は何か不足している可能性がありますが、これはNullReferenceExceptionを投げませんか?それはあなたの問題の少なくとも一部でなければなりません。

if (clt == null) 
{ 
    return clt.ClientName; 
    ... 
+0

が正しいことを確認し、 'return client.ClientName;'に対してそれを変更します。 –

0

あなたが受け取ったリストから最初に新しく見つかったクライアントの名前を返そうとしている理由を理解できません。なぜ、データベースに挿入している新たに見つかったクライアントの総数を整数に戻すだけではないのでしょうか。

試してみてください。

public string AddClients(IEnumerable<Client> newClients) 
{ 
    string str = ""; 
    List<Client> newClientsList = newClients.ToList(); 

    //to save processor and network 
    List<string> existingClients = dc.Clients.Select(x => x.ClientName).ToList(); 

    List<Client> clientsToAdd = (from nc in newClientsList 
           join ec in existingClients on nc.ClientName equals ec into nec 
           from ec in nec.DefaultIfEmpty() 
           where ec == null 
           select nc).ToList(); 

    if (clientsToAdd.Count > 0) 
    { 
    dc.Clients.InsertAllOnSubmit(clientsToAdd); 
    foreach (Client c in clientsToAdd) 
     str += "found: " + c.ClientName + "\n"; 

    return str; 
    } 

    return "0 new clients found"; 
} 

簡単に、単純に、クリーナー。

関連する問題