首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解决在xamarin.forms中使用wcf wcf服务时的目标调用异常?

如何解决在xamarin.forms中使用wcf wcf服务时的目标调用异常?
EN

Stack Overflow用户
提问于 2016-03-08 07:28:12
回答 2查看 282关注 0票数 1

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

代码语言:javascript
运行
复制
    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手机一样的手机时,就会出现一个错误,即目标调用异常。我该怎么做才能解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-08 10:39:11

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-03-08 16:45:59

由于几个原因,这不是一个很好的实施办法。首先,您正在使用async void来处理异步完成事件,该事件将无声地忽略任何引发的异常。第二,异步/已完成模式不适合一次性异步调用。第三,在大多数情况下(包括这种情况),异步/完成模式产生的代码非常混乱。

您应该使用的是Task.Factory.FromAsync<>()助手,它将大大简化您的代码并解决这些问题。对你来说是这样的:

代码语言:javascript
运行
复制
<Button Click="Button_Click" Text="Click Me"/>

..。

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35861455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档