Web服务未处理的异常

时间:2011-07-24 07:19:53

标签: c# web-services windows-phone-7

要使用webservice,我添加了一个Web服务引用,然后将以下代码添加到我的MainPage.xaml.cs文件中。

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捕获,任何人都知道为什么?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,在调查后我做了以下解决了这个问题:

通常你会在类中找到导致错误的两个属性:

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

private System.Xml.Linq.XElement any1Field;

我做的是以下内容:

1-将数组中的第一个属性更改为单个值变量,如下所示

private System.Xml.Linq.XElement anyField;

2-更改此属性的getter和setter方法,以匹配您的更改

[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"); 
    } 
}   
*/

此时,您现在可以通过调用“Any”属性来访问生成的XML,该属性将返回一个可以操作的xml:

ex,就我而言,下面的类引起了问题

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

    }    
}

答案 1 :(得分:0)

异常处理程序没有捕获异常,因为它发生在框架中并且超出了范围。根据Web服务是否符合最佳实践,它可能会显示一个Error对象,如果是,您应该在尝试检索任何数据之前检查它。

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