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

时间:2016-02-25 19:03:48

标签: c# .net wcf xamarin xamarin.forms

我得到了很奇怪的例外:

  

类型' System.InvalidOperationException'的例外情况发生在   System.ServiceModel.ni.dll但未在用户代码中处理

     

其他信息:合同' ICalculatorService'包含   同步操作,Silverlight不支持。分裂   操作进入"开始"和"结束"部件并设置AsyncPattern   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(可移植)项目,添加了View,并在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模型中吗?

2 个答案:

答案 0 :(得分:1)

Xamarin说:

  

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

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

[OperationContract(AsyncPattern = true)]

有关详细信息,请参阅:here

答案 1 :(得分:1)

好的,让我们看看。您正在使用Xamarin.Forms和PCL项目。 PCL项目使用与Silverlight相同的配置文件,Silverlight不支持同步方法,因此您的应用程序不支持它们。

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