是否有任何受支持的方式可以从跨平台 Xamarin 代码调用 asmx Web 服务?

Posted

技术标签:

【中文标题】是否有任何受支持的方式可以从跨平台 Xamarin 代码调用 asmx Web 服务?【英文标题】:Is there any supported way to call asmx web services from cross-platform Xamarin code? 【发布时间】:2015-06-08 00:15:06 【问题描述】:

我们无法弄清楚如何从跨平台 Xamarin 代码调用 asmx Web 服务。似乎有四种选择。前两个似乎有缺陷,另外两个的信息很少。

谁能给点建议?当然,必须至少有一种支持的方式来从跨平台 Xamarin 应用程序调用 Web 服务。

以下是我们目前所知的选项:

    我们尝试使用 WCF 从可移植类库 (PCL) 进行调用。我们得到了一些不正确的行为,我们将其归结为 Xamarin 上的 WCF 仅是“preview”这一事实。 (生成的 XML 与在其他 WCF 实现下运行的相同代码生成的 XML 不同,并且不被目标服务器接受。)此外,针对 Windows Phone 8.1 的 PCL 配置文件不支持 WCF。 (!) 我们查看是否可以放弃使用 WCF,并使用 PCL 中的“老派”ASMX 类型代理。关于这是否可能,似乎有大量相互矛盾的信息。例如here,一位 Xamarin 员工写道,不支持在 PCL 中使用 ASMX 样式的 Web 引用,您必须使用 WCF。但我们已经确定,使用 WCF 可能不是一个好主意(参见 #1)。 我们是否应该滚动我们自己的调用代码,仅基于 HttpClient? 或者我们应该放弃所有 PCL 的使用,而改用共享库

非常感谢您可以分享的任何帮助或经验。

【问题讨论】:

只是好奇为什么您仅限于通过 WCF/ASMX 使用 SOAP?你能不能只写一个以 JSON 作为协议的 RESTful 服务? ASP.NET Web API 将是一个很好的候选者。我认为您甚至可以采用当前的 WCF 服务并公开一些 JSON 端点。 我们“不能”改变或增强服务 这不是您想听到的,但 ASMX 是一项过时的技术,我认为没有一种好的/干净的方法可以直接从移动应用程序调用。在我的脑海中,创建一个“包装器”Web 服务(使用 WCF 或 Web API)。在这里,调用您的 ASMX 可能更容易。如果成功,您可以以 JSON 格式返回结果,以便您的应用可以使用。听起来有点做作,但可能值得考虑。 【参考方案1】:

这是我的两分钱,我认为你应该选择 3 或 4...

3 - 你应该重写你的后端,使其更加友好,使用更轻的格式,如 json,也许使用 asp.net web api,因为你似乎已经有一个 .net 后端,并且在客户端是使用 httpclient。

4 - 使用共享项目,WCF 支持应该可以正常工作。这没关系,但如果您使用的是 Xamarin.Forms,共享项目和 xaml 仍然存在一些问题。

根据很多事情,我个人会选择 3 ..

【讨论】:

【参考方案2】:

这个问题或多或少在 Xamarin 论坛上得到了回答,这里是 http://forums.xamarin.com/discussion/42693/what-is-the-definitive-best-way-to-call-web-services-from-cross-platform-code

答案基本上是“不,没有确定的正确答案”。

两个具体点:

我们现在已经隔离了我们看到的具体问题 一个已知的bug in Mono's implementation of DataContractSerializer。 (它不尊重 EmitDefaultValue 标志)。 这一发现为我们提供了 对 Xamarin WCF 实施的稳健性更有信心 (因为那不是错误所在),但总的来说 WCF 已经离开 我们为它的复杂性而伤痕累累,但仍因缺乏 Mono 实现中的可配置性(它不是可定制的 作为完整版)。我们正在考虑 ServerStack 客户端 类作为替代方案。

【讨论】:

以上是关于是否有任何受支持的方式可以从跨平台 Xamarin 代码调用 asmx Web 服务?的主要内容,如果未能解决你的问题,请参考以下文章

是否有一个通知平台同时支持带有 Xamarin 的移动应用程序和带有 Javascript 的 Web 浏览器

从 xamarin.mac / xamarin.forms 的编辑菜单中删除表情符号和符号

是否有可用的事件(在 xamarin 或特定于平台的)可用于收听用户设备时间的任何变化?

在 Xamarin 跨平台应用程序中进行 USSD 调用

是否可以使用 xamarin.form 在我的应用程序中打开另一个应用程序?

是否有mvvmcross提供的标签式布局平台?