2012-12-28 84 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; 
} 

我能够从e.Result获得POX结果。以下是示例结果

<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> 

但是,当我使用LINQ查询XDocument时,我没有收到结果。为了测试目的,我已经手动加载了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" 

移除的属性,我认为这些属性提高分析问题,当我查询使用LINQ中的XDocument。

+0

感谢faester您的善意回复,我所做的更改什么ü建议,但我仍无法得到的数据,我已经作出更改下方,的XDocument xdStudent =的XDocument。解析(e.Result); XNamespace ns =“http://schemas.datacontract.org/2004/07/WCF_REST_Service/”;我修改了linq查询以及EmpNo = emp.Element(ns +“EmpNo”)。Value,EmpName = emp.Element(ns +“EmpName”)。Value –

回答

0

您的问题与WCF无关,只涉及您的XML解析。您在测试示例中删除的“属性”是文档的名称空间,解析需要使用名称空间来标识节点。在您的测试情况下,你问的LINQ解析没有命名空间的元素,而不是元素具有完全限定名

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

所以你的测试,严格来说是从你的生活情景完全不同。

看看这里at this question about Linq to XML

+0

非常感谢你的建议,我已经将XNamespace添加为逢。但是现在我收到“对象引用未设置为对象实例”错误。 :(根据我在使用WCF Rest服务时不需要添加代理类的知识,请让我知道我会错的。 –

+0

希望你已经解决了它,但是你能为异常提供一个stacktracke吗? – faester