2011-07-24 126 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 ... 

    }  
}