首页 > 解决方案 > Xamarin.Forms 在 WCF 上添加连接服务仅生成异步方法

问题描述

我刚开始用 .Net Standard 2.0 (PCL) 项目做 Xamarin.Forms。我正在尝试使用我的 WCF Web 服务,但从未成功完成。

我创建了一个简单的 WCF,如下所示

[ServiceContract]
public interface IWcfConnection
{        
    [OperationContract]
    string GetHelloWorld();
}

实现如下

public class WcfConnection : IWcfConnection
{
    public string GetHelloWorld()
    {
        return "Hello World";
    }
}

这是一个非常简单的 WCF,当我转到我的 Xamarin.Forms 并右键单击“连接的服务”时,没有“添加 Web 服务”,只有“添加连接的服务”,所以我选择如下

在此处输入图像描述

然后选择“Microsoft WCF Web 服务服务提供商”

在此处输入图像描述

选择如下选项(我取消所有选项,因为如果我添加超过 1 个服务,它会崩溃)

在此处输入图像描述

当我查看创建的 reference.cs 时,只创建了异步方法。

public System.Threading.Tasks.Task<string> GetHelloWorldAsync()
{
    return base.Channel.GetHelloWorldAsync();
}

1)我可以知道为什么只创建 async 吗?是否适用于 .net 标准和核心,只会创建异步服务?当我在某处阅读时。

2) 如果是这样,我如何使用 Web 服务?

在我的 xaml.cs 文件中,我执行了以下操作,

WcfConnectionService.WcfConnectionClient client = new WcfConnectionService.WcfConnectionClient(new WcfConnectionService.WcfConnectionClient.EndpointConfiguration());

string abc = client.GetHelloWorldAsync().GetAwaiter().GetResult();

但是我遇到了错误并且无法相应地工作。有人知道吗?

未处理的异常:

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

标签: wcfxamarin.formsasync-await.net-standard-2.0

解决方案


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

通过选中“配置 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);

推荐阅读