如何在.netstandard中使用带有Xamarin.Forms项目的WCF服务?

时间:2017-12-27 09:28:54

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

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

  

System.ServiceModel.FaultException`1 [[System.ServiceModel.ExceptionDetail,   System.ServiceModel,Version = 2.0.5.0,Culture = neutral,   PublicKeyToken = 31bf3856ad364e35]]:反序列化主体时出错   请求操作'GetData'的消息。 OperationFormatter   遇到无效的Message正文。预计会找到节点类型   'Element',名称为'GetData',名称空间为'http://tempuri.org/'。   找到名为“GetDataAsync”和名称空间的节点类型“Element”   'http://tempuri.org/'

我也尝试将.netstandard版本更改为旧版本,但它也会出现同样的错误。

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:1)

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

Generate Synchronous Operations

使用Web服务:

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);