要使用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捕获,任何人都知道为什么?
答案 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对象,如果是,您应该在尝试检索任何数据之前检查它。
这可能会产生类似于你的症状,但我不确定这是你面临的问题。