2011-07-24 20 views
1

webserviceを使用するには、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 コードで

:それはのtry-catchで捕捉いない

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

、誰もがなぜ知っていますか?

+0

結果としてあなたのWebサービスが返すタイプは何ですか? – sternr

+0

web-phone-7はADO.NETをサポートしていないため、ご利用いただきありがとうございます。ウェブサービスからDataTableが返されます。 – kylin

答えて

0

例外がフレームワークで発生し、範囲外であるため、例外ハンドラによって例外がキャッチされません。 Webサービスがベストプラクティスに準拠しているかどうかによって、Errorオブジェクトが表示されることがあります。その場合は、データを取得する前に検査する必要があります。

これはあなたと似たような症状を引き起こすことがありますが、これはあなたが直面している問題ではありません。

+0

ありがとうございました。この問題は、リターンデータセットに起因しています。 windows-phone-7はADO.netをサポートしていません。 – kylin

+0

ADO.NETはデータをXMLとして返します。 Linq2Xmlを使用して処理することができます。 –

+0

本当にありがとうございました、私は努力しています。 – kylin

1

私は同じ問題に直面していると調査後、私は問題を解決し、以下のなかった:通常、エラーの原因となったクラスに2つのプロパティを見つけるでしょう

を:私は何

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-削除するか、第二のコメントアウト変更を一致させますプロパティのゲッターとセッターメソッド

/* 
[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あなたが操作でき、XMLを返しますNY」プロパティ:

exが、私の場合には、それは私が

を次のようにXMLにアクセスすることができた問題を私の方法で

public partial class GetUserBalancesClassAccounts 

を引き起こして次のクラスでした

GetUserBalancesClassAccounts accts = balances.Accounts; 

XElement doc = accts.Any; 

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

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

    ... do something ... 

    }  
}