【问题标题】:How to use WCF services in .netstandard with Xamarin.Forms project?如何在 Xamarin.Forms 项目中使用 .netstandard 中的 WCF 服务?
【发布时间】:2017-12-27 09:28:53
【问题描述】:

我创建了一个带有 .netstandard 2.0 的 Xamarin.Forms 项目作为 PCL 项目。我正在尝试在该项目中使用 WCF 服务。我已经为 WCF 服务添加了连接服务。当我尝试调用服务中提供的任何方法时,它会给出如下错误:

System.ServiceModel.FaultException`1[[System.ServiceModel.ExceptionDetail, System.ServiceModel,版本=2.0.5.0,文化=中性, PublicKeyToken=31bf3856ad364e35]]: 反序列化主体错误 操作“GetData”的请求消息。操作格式化程序 遇到无效的消息正文。期望找到节点类型 具有名称“GetData”和命名空间“http://tempuri.org/”的“元素”。 找到名称为“GetDataAsync”和命名空间的节点类型“Element” 'http://tempuri.org/'

我也尝试将 .netstandard 版本更改为旧版本,但它给出了相同的错误。

【问题讨论】:

  • 错误提示body的形状不正确,而不是方法未实现。模型是否正确?
  • @Neil 是的,模型是正确的。实际上GetData方法可能是Visual Studio中WCF服务提供者生成的代理类有问题
  • 您好!有谁知道 Xamarin 是否与基于任务的异步 WCF 代理方法兼容?提前致谢。
  • @Ignacio 我认为这需要时间,因为目前还没有实施的消息。

标签: wcf xamarin xamarin.forms .net-standard


【解决方案1】:

目前,Xamarin 应用与 WCF Web Service Reference 连接服务提供程序为 .NET 标准项目 (bugzilla.xamarin.com Bug 51959) 生成的基于任务的异步 WCF 代理方法不兼容。

生成旧的、兼容样式的 WCF 代理方法的一种方法是在 Developer Command Prompt 中使用 /async/tcv:Version35 开关运行 SvcUtil.exe。这将生成同步代理方法、Begin/End 样式异步编程模型 (APM) 回调代理方法和基于事件的代理方法,所有这些都与 Xamarin 应用程序兼容。

(注意:如果省略/async 开关,SvcUtil.exe 将生成更新的、不兼容的基于任务的代理方法。)

【讨论】:

  • 我认为,没有使用旧选项生成代理类的选项,因为 Visual Studio 2017 svcutil.exe 再次生成 async/await 样式的代理方法
  • 嗯。您也可以尝试显式传递 /tcv:Version35 选项。根据documentation:“当使用/tcv:Version35/async 开关时,会生成基于事件和基于回调/委托的异步方法。”在我对C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\SvcUtil.exe 的快速测试中,我得到了所需的回调和基于事件的方法。
  • 啊哈。似乎如果您省略 /async 标志,它现在默认包含基于任务的方法以及同步方法。我将稍微修改一下我的答案以说明这一点,并提及/tcv:Version35 标志,因为这是获取基于事件的方法所必需的。
  • @BrendanZagaeski 我刚刚使用svcutil 生成了一个Reference.cs 文件并将其添加到我的.Net Standard 1.4 项目中,但出现错误:“类型或命名空间名称'IExtensibleDataObject'不存在于命名空间“System.Runtime.Serialization””你知道是什么原因造成的吗?我已经在整个互联网上查看了该参考,但看不到它
  • 看起来IExtensibleDataObject 的类型是not available in .NET Standard 1.4is available in .NET Standard 2.0 类型,如果您可以选择切换到该目标框架。 “WCF Web 服务参考”代理似乎丢弃了使用该类型的属性,因此另一种选择可能是从 SvcUtil 代理中编辑出受影响的属性
【解决方案2】:

通过选中配置 WCF Web 服务参考屏幕上的“生成同步操作”复选框来生成旧的兼容样式的 WCF 代理方法:

使用网络服务:

KimlikServiceReference.KPSPublicSoapClient soapClient = new KimlikServiceReference.KPSPublicSoapClient(KimlikServiceReference.KPSPublicSoapClient.EndpointConfiguration.KPSPublicSoap);
//KimlikServiceReference.TCKimlikNoDogrulaResponse response = soapClient.TCKimlikNoDogrulaAsync(TCKimlikNo, Ad, Soyad, DogumYili).Result;
bool result = soapClient.TCKimlikNoDogrula(TCKimlikNo, Ad, Soyad, DogumYili);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2021-11-13
    • 2017-05-31
    • 2018-01-23
    • 1970-01-01
    • 2020-04-22
    相关资源
    最近更新 更多