Xamarin 异常 - 协定包含不支持的同步操作

本文关键字:不支持 同步操作 包含 异常 Xamarin | 更新日期: 2023-09-27 18:36:17

>我得到了一个非常奇怪的异常:

类型为"System.InvalidOperationException"的异常发生在 System.ServiceModel.ni.dll但未在用户代码中处理

附加信息:合同"ICalculatorService"包含 同步操作,在 Silverlight 中不受支持。分裂 操作分为"开始"和"结束"部分并设置异步模式 属性在 OperationContractAttribute 为 'true' 时。请注意,您确实 不必在服务器上进行相同的更改。

我有世界上最简单的WCF服务。无异步代码。只是这个:

主机:

[ServiceContract]
public interface ICalculatorService
{
    [OperationContract]
    string GetSum(int a, int b);
}
public class CalculatorService : ICalculatorService
{
    public string GetSum(int a, int b)
    {
        return (a + b).ToString();
    }
}
class Program
{
    static void Main(string[] args)
    {
        Uri[] addressBase = new Uri[] { new Uri("http://localhost:9003/CalculatorService") };
        var host = new ServiceHost(typeof(CalculatorService), addressBase);
        host.Open();
        Console.Read();
    }
}

主机配置:

<system.serviceModel>
  <services>
    <service name="MobileWCF.ServerHost.CalculatorService">
      <endpoint address="net.tcp://localhost:8003/CalculatorService" binding="netTcpBinding"
        contract="MobileWCF.Contracts.ICalculatorService" />
      <endpoint address="http://localhost:9003/CalculatorService" binding="basicHttpBinding"
        contract="MobileWCF.Contracts.ICalculatorService" />
    </service>
  </services>
</system.serviceModel>

然后,我添加了 Xamarin.Forms (可移植)项目,添加了视图,并在 onClickEvent 的代码隐藏中添加了:

    void OnButtonClicked(object sender, EventArgs e)
    {
        string strAddress = "http://localhost:9003/CalculatorService";
        BasicHttpBinding httpBinding = new BasicHttpBinding();
        EndpointAddress address = new EndpointAddress(strAddress);
        ChannelFactory<ICalculatorService> channel = new ChannelFactory<ICalculatorService>(httpBinding, address);
        var game = channel.CreateChannel(address);
        var num = game.GetSum(3,4);
    }

为什么我会收到此异常。Xamarin.Forms 是否不允许同步服务?一切都应该在开始/结束 APM 模型中?

Xamarin 异常 - 协定包含不支持的同步操作

好的,让我们看看。你正在将 Xamarin.Forms 与 PCL 项目一起使用。PCL 项目使用与 Silverlight 相同的配置文件,并且 Silverlight 不支持同步方法,因此你的应用不支持它们。

如果要使用它,或者更改方法以遵循异步模式或更改项目类型以使用共享项目,则共享项目不使用可移植类配置文件,可以使用完整框架。

> Xamarin 说:

Xamarin.Forms 完全支持使用 WinRT 的 Windows Phone 8.1 平台。使用 Windows Phone 8.1 支持的应用程序的外观可能与早期基于 Silverlight 的 Xamarin.Forms Windows Phone 应用程序不同。

Silverlight 中的所有服务调用都是异步的。对于此用途:

[OperationContract(AsyncPattern = true)]

有关更多信息,请参阅:此处