私の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はクライアントエンティティのリストです。
サーバーとクライアントの両方でWCFコードにブレークポイントを配置しようとしましたか?上記の方法のリターンはヒットしていますか?例外がスローされますか? Silverlightイベントハンドラが呼び出されますか? Silverlight AsyncCompletedEventArgs(e.Error)の例外はnullですか? –
私はサービス内のポイントを破ることはできません(少なくとも、起動しません。クライアントアプリケーションプロジェクトの一部ではなく、IISでホストされています)。私は返されたエラーメッセージをチェックしませんでした。提案していただきありがとうございます。 – TheFaithfulLearner
Nah、あなたはWCFコードにブレークポイントを置くことができます。私はいつもそれをする。ローカルIISサーバーで実行し、デバッガをアタッチしておくだけです。 WCFプロジェクトがクライアントコードと同じソリューションの一部である場合(これを行うことができれば私がお勧めします)、これは完全にシームレスです。 –