2011-12-14 62 views
0

好吧,我有一个WCF服务将作为一种访问我的SQL数据库的方式。这部分已经在很大程度上与这个问题无关,因为由于某种原因,我的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的大小,参数)。这没关系,并且至少证明该服务可以连接到,它返回消息没关系,而不是。

如果我删除最顶端的回报,这是它变得有趣(好,有问题)的地方。它应该返回clt.ClientName,在if (clt==null)的条件下,或者它应该返回nelse.ToString()这是最后的权利。

我究竟得到了什么?没有。完成的方法似乎永远不会被调用(它显示的消息框永远不会出现)。

我已经评论了大部分内容。当然,它必须达到这些条件之一!我错过了一些非常明显的东西吗?我真的一直试图调试这个很长时间,但没有!有人能看到我看不到的东西吗?

为了记录,'dc'是数据上下文,dc.Clients是客户端实体列表。

+0

您是否曾尝试在WCF代码中放置断点,无论是在服务器上还是在客户端上?上述方法中的回报受到打击吗?是否抛出任何异常? Silverlight事件处理程序是否被调用? Silverlight AsyncCompletedEventArgs(e.Error)null中的异常? – 2011-12-14 17:28:57

+0

我不得不在服务中断点(或者至少它们不会触发;它不是我客户端应用程序项目的一部分 - 它托管在IIS中)。尽管我没有检查返回的错误消息。感谢您的建议。 – TheFaithfulLearner 2011-12-15 09:12:41

回答

1

我可能会错过一些东西,但不会抛出NullReferenceException?这至少是你问题的一部分。

if (clt == null) 
{ 
    return clt.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"; 
} 

更容易,更简单,更清洁。