2012-12-28 4 views
0

В моем приложении у меня есть служба WCF REST, которая вызывает звонок от моего клиента silverlight.Проблема при использовании службы WCF

private void btnGetEmployees_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      WebClient wClient = new WebClient(); 
      wClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wClient_OpenReadCompleted); 
      wClient.DownloadStringAsync(new Uri("http://localhost/DummyService/Service.svc/EmpRest", UriKind.Absolute)); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

void wClient_OpenReadCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
XDocument xdStudent = XDocument.Parse(e.Result); 
var Result = (from emp in xdStudent.Descendants("Employee") 
          select new Employee 
          { 
          EmpNo = emp.Element("EmpNo").Value, 
          EmpName = emp.Element("EmpName").Value 
          } 
         ).ToList(); 

      dgData.ItemsSource = Result; 
} 

Я могу получить результат POX от e.Result. Ниже приведен пример результатов

<ArrayOfEmployee xmlns="http://schemas.datacontract.org/2004/07/WCF_REST_Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<Employee> 
<EmpName>Emp_1</EmpName> 
<EmpNo>101</EmpNo> 
</Employee> 
<Employee> 
<EmpName>Emp_2</EmpName> 
<EmpNo>102</EmpNo> 
</Employee> 
<Employee> 
<EmpName>Emp_3</EmpName> 
<EmpNo>103</EmpNo> 
</Employee> 
<Employee> 
<EmpName>Emp_4</EmpName> 
<EmpNo>104</EmpNo> 
</Employee> 
<Employee> 
<EmpName>Emp_5</EmpName> 
<EmpNo>105</EmpNo> 
</Employee> 
</ArrayOfEmployee> 

Но когда я в XDocument Запрос Использование LINQ, я не получаю результат. Я для целей тестирования я загрузил XDocument вручную (не из службы), как показано ниже, и смог получить значения.

string xml = @" 
      <ArrayOfEmployee > 
       <Employee> 
       <EmpName>Emp_1</EmpName> 
       <EmpNo>101</EmpNo> 
       </Employee> 
       <Employee> 
       <EmpName>Emp_2</EmpName> 
       <EmpNo>102</EmpNo> 
       </Employee> 
       <Employee> 
       <EmpName>Emp_3</EmpName> 
       <EmpNo>103</EmpNo> 
       </Employee> 
       <Employee> 
       <EmpName>Emp_4</EmpName> 
       <EmpNo>104</EmpNo> 
       </Employee> 
       <Employee> 
       <EmpName>Emp_5</EmpName> 
       <EmpNo>105</EmpNo> 
       </Employee> 
      </ArrayOfEmployee>"; 
      XDocument xdStudent = XDocument.Parse(xml); 

Единственное изменение, которое я сделал это удалять атрибуты из корневого тега

xmlns="http://schemas.datacontract.org/2004/07/WCF_REST_Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 

Я думаю, что эти атрибуты поднимают вопрос синтаксического анализа, когда я запрашивая XDocument с помощью LINQ.

+0

Благодаря faester для Вашего ответа, я сделал изменения, что у предложенных, но все-таки я не могу получить данные, я сделал ниже изменения, XDocument xdStudent = XDocument. Синтаксический (e.Result); XNamespace ns = "http://schemas.datacontract.org/2004/07/WCF_REST_Service/"; Я также изменил запрос linq, а также EmpNo = emp.Element (ns + «EmpNo»). Значение, EmpName = emp.Element (ns + «EmpName»). Значение –

ответ

0

Ваша проблема не связана с WCF и касается только анализа XML. «Атрибуты», которые вы удалили в тестовом примере, представляют собой пространства имен для документа, а для разбора требуется пространство имен для идентификации узлов. В тестовом случае вы спрашиваете Linq для разбора элементов без пространства имен, а не элементы с полностью квалифицированными именами

http://schemas.datacontract.org/2004/07/WCF_REST_Service:Employee

так что ваш тест, строго говоря, совершенно отличается от вашего жизненного сценария.

Посмотрите здесь at this question about Linq to XML

+0

Большое спасибо faester, как я уже сказал, я добавил XNamespace как вэй. Но теперь я получаю ошибку «Ссылка на объект, не установленную на экземпляр объекта». :(Согласно моим знаниям, когда использование службы WCF Rest не нужно добавлять прокси-класс, сообщите мне, что я ошибся. –

+0

Надеюсь, вы уже решили это, но могли бы вы предоставить stacktracke для исключения? – faester

Смежные вопросы