如何在xamarin.forms中使用wcf webservices时解决targetinvokationexception?

时间:2016-03-08 07:28:12

标签: c# web-services wcf xamarin.ios xamarin.forms

我在xamarin.forms中使用WCF soap web服务。我已经从visual studio中添加了生成异步操作的服务引用。我使用以下代码来使用Web服务

    Service1Client dataCommunicator = new Service1Client();
                                dataCommunicator.GiveFeedbackCompleted += new EventHandler<GiveFeedbackCompletedEventArgs>(GiveFeedbackCallback);
                                dataCommunicator.GiveFeedbackAsync(editPhoneF.Text, monuments[pickerMonument.SelectedIndex], editRemarks.Text, imei);
}
    private async void GiveFeedbackCallback(object sender, GiveFeedbackCompletedEventArgs e)
            {
                if (e.Result)
                {
                    await DisplayAlert("Success", "Thank you for your valuable comments", "Ok");
                }
                else
                {
                    await DisplayAlert("Oops!!", "Internal server error, please try again later", "Ok");
                }
            }

当我在模拟器上测试时,我只是坐着等待回复,当我尝试使用类似Android手机的手机时,会出现错误,即targetinvocationexception。 我该怎么办才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

由于几个原因,这不是一个好的实现。首先,您使用async void来处理异步完成事件,该事件将无提示地忽略引发的任何异常。其次,异步/完成模式不适合单次异步调用。第三,Async / Completed模式产生的代码在大多数情况下(包括这个)都非常混乱。

您应该使用的是Task.Factory.FromAsync<>()帮助程序,它将极大地简化您的代码并解决这些问题。它看起来像这样:

<Button Click="Button_Click" Text="Click Me"/>

...

async void Button_Click(object sender, EventArgs eventArgs) {
    Service1Client dataCommunicator = new Service1Client();
    try {
        bool result =
            await Task.Factory.FromAsync<string, Monument, string, IMEI, bool>(
                dataCommunicator.BeginGiveFeedback,
                dataCommunicator.EndGiveFeedback,
                editPhoneF.Text,
                monuments[pickerMonument.SelectedIndex],
                editRemarks.Text,
                imei);
        if (e.Result) {
            await DisplayAlert("Success", "Thank you for your valuable comments", "Ok");
        } else {
            await DisplayAlert("Internal server error", "Please try again later.", "Ok");
        }
    } catch (Exception ex) {
        await DisplayAlert("Server communication error", "Please try again later. ERROR: " + ex.GetType().Name, "Ok");
    }
}

请注意,我在这里使用async void,你可能会认为我这样做是自相矛盾的。当您在该处理程序中手动捕获异常时,可以将async void用于控件的事件处理程序(正如我在示例代码中所做的那样)。

答案 1 :(得分:0)

我认为,Xamarin.Forms中存在一个错误,它正在创建问题。我删除了服务引用,现在手动使用该服务。我从下面的链接中找到了线索,并使用相同的方式来使用Web服务。

https://stackoverflow.com/questions/14336414/httpclient-soap-c/20108971#20108971