行为不正常的WCF服务异步调用

行为不正常的WCF服务异步调用,wcf,linq-to-sql,Wcf,Linq To Sql,好的,我有一个WCF服务,它将作为访问我的SQL数据库的一种方式。由于某种原因,我的WCF服务崩溃了,所以这一部分在很大程度上与这个问题无关。或者,至少,它会导致我的客户端Silverlight应用程序崩溃。这就是我来这里问你们的原因 这是代码。请记住,它是从我的Silverlight客户端异步调用的。完成后,此方法返回的字符串将显示在客户端的屏幕上 public string AddClients(IEnumerable<Client> newClients) {

好的,我有一个WCF服务,它将作为访问我的SQL数据库的一种方式。由于某种原因,我的WCF服务崩溃了,所以这一部分在很大程度上与这个问题无关。或者,至少,它会导致我的客户端Silverlight应用程序崩溃。这就是我来这里问你们的原因

这是代码。请记住,它是从我的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();

    }
公共字符串AddClients(IEnumerable newClients)
{
int-nAdded=0;
int-nelse=0;
字符串str=“”;
List newClientsList=newClients.ToList();
List existingClients=dc.Clients.ToList();
List clientsToAdd=新列表();
返回newClientsList.Count.ToString();
foreach(newClientsList中的客户端)
{
var clt=existingClients.FirstOrDefault(c=>c.ClientName==client.ClientName);
如果(clt==null)
{
返回clt.ClientName;
//str=str+“找到:”+clt.ClientName+“\n”;
//dc.客户(clt);
//现有客户端。添加(clt);
//clientsToAdd.Add(clt);
nAdded++;
}
其他的
{
nelse++;
}
}
如果(添加>0)
{
//str=str+“多个已添加”;
//dc.Clients.InsertAllOnSubmit(客户端添加);
//dc.提交更改();
}
返回nelse.ToString();
}
你也许能够弄清楚应该发生什么,但大部分事情现在都没有发生,因为事实上这对我来说不是很好

目前,正如你所看到的,很早就有了回报(在foreach之前)。就目前的情况而言,这是可行的。你按下客户端的一个按钮,它会打电话,然后返回。因此,您可以将“3”作为字符串返回(这是newClients的大小,即参数)。这没关系,至少证明了服务可以连接到,它可以返回消息,等等

如果我去掉最高的回报,这就是它变得有趣的地方(好吧,有问题)。它应该在
if(clt==null)
条件下返回
clt.ClientName
,或者应该返回位于末尾的
nelse.ToString()

我到底得到了什么?没有什么。完成方法似乎从未被调用(它显示的消息框从未出现)

我把大部分东西都评论掉了。当然,它必须达到这些条件之一!我错过了一些很明显的东西吗?我真的已经尝试调试这个很久了,但是什么都没有!有人能看到我看不到的明显的东西吗


作为记录,“dc”是数据上下文,dc.Clients是客户端实体的列表。

我不明白您为什么要从收到的列表中返回第一个新找到的客户端的名称。为什么不返回一个整数,其中包含插入到数据库中的新找到的客户端的总数呢

尝试:

公共字符串AddClients(IEnumerable newClients)
{
字符串str=“”;
List newClientsList=newClients.ToList();
//节省处理器和网络
列出existingClients=dc.Clients.Select(x=>x.ClientName.ToList();
列表clientsToAdd=(来自newClientsList中的nc
将ec加入nc上的现有客户端。ClientName等于ec加入nec
来自nec.DefaultIfEmpty()中的ec
其中ec==null
选择nc).ToList();
如果(clientsToAdd.Count>0)
{
dc.Clients.InsertAllOnSubmit(客户端添加);
foreach(clientsToAdd中的客户端c)
str+=“找到:”+c.ClientName+“\n”;
返回str;
}
返回“发现0个新客户端”;
}  

更容易、更简单、更干净。

我可能遗漏了一些东西,但这不会引发
NullReferenceException
?这至少是你问题的一部分

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

您是否尝试在服务器和客户端的WCF代码中设置断点?上述方法中的返回是否命中?是否抛出任何异常?Silverlight事件处理程序是否调用过?Silverlight AsyncCompletedEventArgs(e.Error)中的异常是否为null?我只能中断服务中的点(或者,至少它们不会触发;它不是我的客户端应用程序项目的一部分-它托管在IIS中)。但是我没有检查返回的错误消息。谢谢你的建议。不,你可以在你的WCF代码中设置断点。我总是这样做。您只需要在本地IIS服务器上运行它,并连接调试器。如果您的WCF项目是与您的客户机代码相同的解决方案的一部分(如果您能够做到这一点,我建议您这样做),那么它是完全无缝的。
if (clt == null)
{
    return clt.ClientName;
    ...