2011-12-14 4 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()을 반환해야합니다.

실제로 얻는 방법은 무엇입니까? 아무것도. 완성을위한 메소드는 절대로 호출되지 않습니다 (메시지 상자가 나타나지 않는 것으로 나타남).

나는 대부분의 것들을 주석 처리했습니다. 분명히 이러한 조건 중 하나에 도달해야합니다! 나는 여기서 정말로 분명한 것을 놓쳤는가? 나는 정말로 이것을 여러 해 동안 디버깅하려고 시도했지만 아무것도하지 못했다! 누군가 내가 볼 수없는 명백한 것을 볼 수 있습니까?

레코드의 경우 '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"; 
} 

쉽게, 간단, 청소기.

관련 문제