2011-07-24 42 views
1

要使用我添加了一个Web服务引用,然后web服务下面的代码添加到我的MainPage.xaml.cs中的文件。Web服务未处理的异常

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using Microsoft.Phone.Controls; 

namespace WebServiceTest 
{ 
    public partial class MainPage : PhoneApplicationPage 
    { 
    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
     ServiceReference.PDAServiceSoapClient ws = 
      new ServiceReference.PDAServiceSoapClient(); 
     ws.GetResoureAroudCompleted += 
      new EventHandler<ServiceReference.GetResoureAroudCompletedEventArgs>(ws_GetResoureAroudCompleted); 

     ws.GetResoureAroudAsync("基站,机楼", 113, 23, 10000); 
     } 
     catch 
     { 
     System.Windows.MessageBox.Show("error!"); 
     } 
    } 

    void ws_GetResoureAroudCompleted(object sender, ServiceReference.GetResoureAroudCompletedEventArgs e) 
    { 
     if (e.Error != null) 
     { 
     var result = e.Result; 
     } 
    } 
    } 
} 

然后我跑PhoneApplication并得到此异常:

System.InvalidOperationException了未处理 消息=有反射型的错误 'WebServiceTest.ServiceReference.GetResoureAroudResponseGetResoureAroudResult'。 的InnerException信息:System.InvalidOperationException 消息=有反射性 'ANY1' 错误。

在Reference.cs 代码:

public WebServiceTest.ServiceReference.GetResoureAroudResponseGetResoureAroudResult EndGetResoureAroud(System.IAsyncResult result) { 
       object[] _args = new object[0]; 
       **WebServiceTest.ServiceReference.GetResoureAroudResponseGetResoureAroudResult _result = ((WebServiceTest.ServiceReference.GetResoureAroudResponseGetResoureAroudResult)(base.EndInvoke("GetResoureAroud", _args, result)));** 
       return _result; 
      } 

它不是通过的try-catch抓,有人知道为什么吗?

+0

什么类型的网络服务返回的结果呢? – sternr

+0

感谢您的申请,网络服务返回一个DataTable,这是一个问题,因为windows-phone-7不支持ADO.NET。 – kylin

回答

0

的异常,因为它发生在框架和超出范围不是由你的异常处理程序捕获。根据webservice是否符合最佳实践,它可能会显示一个Error对象,如果是这样,您应该在尝试检索任何数据之前检查它。

这可能会产生类似于你的症状,但我不能确定这是你面对的问题。

+0

非常感谢。问题是由返回数据集造成的。 windows-phone-7不支持ADO.net。 – kylin

+0

ADO.NET以XML格式返回数据。您可能可以使用Linq2Xml来处理它。 –

+0

非常感谢您的帮助,我在努力。 – kylin

1

我都面临着同样的问题,调查后,我做了该解决的问题如下:

通常你会发现在类两个属性会导致错误:

private System.Xml.Linq.XElement[] anyField; 

private System.Xml.Linq.XElement any1Field; 

我所做的是以下情况:

1-变化从数组中的第一属性为单个值变量如下

private System.Xml.Linq.XElement anyField; 

2-改变这个属性的获取和设置方法,以匹配更改

[System.Xml.Serialization.XmlAnyElementAttribute(Namespace="http://www.w3.org/2001/XMLSchema", Order=0)] 
public System.Xml.Linq.XElement Any { 
    get { 
     return this.anyField; 
    } 
    set { 
     this.anyField = value; 
     this.RaisePropertyChanged("Any"); 
    } 
} 

3-删除或注释掉第二属性

// private System.Xml.Linq.XElement any1Field; 

4-删除或注释掉第二属性的getter和setter方法

/* 
[System.Xml.Serialization.XmlAnyElementAttribute(Namespace="urn:schemas-microsoft-com:xml-diffgram-v1", Order=1)] 
public System.Xml.Linq.XElement Any1 { 
    get { 
     return this.any1Field; 
    } 
    set { 
     this.any1Field = value; 
     this.RaisePropertyChanged("Any1"); 
    } 
} 
*/ 

此时您现在可以通过调用“A NY”属性,它会返回,您可以操控一个xml:

前,在我的情况下,它是下面的类造成的问题

public partial class GetUserBalancesClassAccounts 

在我的方法,我能够访问XML如下

GetUserBalancesClassAccounts accts = balances.Accounts; 

XElement doc = accts.Any; 

foreach(XElement docElement in doc.Elements()){ 

    foreach (XElement account in docElement.Elements("Account")) 
    { 

    ... do something ... 

    }  
}