Необработанное исключение веб-службы - PullRequest
1 голос
/ 24 июля 2011

Чтобы использовать веб-сервис, я добавил ссылку на веб-сервис, а затем добавил следующий код в мой файл 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 был необработан. Message = Произошла ошибка, отражающая тип 'WebServiceTest.ServiceReference.GetResoureAroudResponseGetResoureAroudResult'.InnerException: System.InvalidOperationException Message = Произошла ошибка при отражении свойства '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;
            }

Это не перехватывается при попытке-захвата, кто-нибудь знает, почему?

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

Я столкнулся с той же проблемой, и после исследования я сделал следующее, что решило проблему:

обычно в классе вы найдете два свойства, вызывающих ошибку:

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

Теперь вы можете получить доступ к полученному XML следующим образом, вызвав свойство «Any», которое вернет 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 ...

    }    
}
0 голосов
/ 24 июля 2011

Исключение не перехватывается вашим обработчиком исключений, потому что оно происходит в платформе и находится вне области видимости.В зависимости от того, соответствует ли веб-сервис передовому опыту, он может обнаружить объект Error, и в этом случае вам следует проверить это перед попыткой получить какие-либо данные.

Это может вызвать симптомы, аналогичные вашим, но яуверен, что это проблема, с которой вы столкнулись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...