【问题标题】:Xamarin exception - The contract contains synchronous operations, which are not supportedXamarin 异常 - 合同包含不支持的同步操作
【发布时间】:2016-06-08 17:52:40
【问题描述】:

我遇到了非常奇怪的异常:

“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 是否不允许同步服务?一切都应该在 Begin/End APM 模型中?

【问题讨论】:

  • 你的异常消息说silverlight! Silverlight 您必须在操作合同中使用 AsynPattern = true。
  • @MKMohanty 更改此设置后,我在更新 ServiceHost 时遇到另一个异常:其他信息:ServiceContract 类型 MobileWCF.Contracts.ICalculatorService 中方法 GetSum 的异步开始方法签名无效。您的 begin 方法必须将 AsyncCallback 和一个对象作为最后两个参数并返回一个 IAsyncResult。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    Xamarin 说:

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

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

    [OperationContract(AsyncPattern = true)]
    

    欲了解更多信息,请参阅:here

    【讨论】:

    • 只有这个?它仍然不起作用。更新 ServiceHost 时出现异常:其他信息:ServiceContract 类型 MobileWCF.Contracts.ICalculatorService 中方法 GetSum 的异步开始方法签名无效。您的 begin 方法必须将 AsyncCallback 和一个对象作为最后两个参数并返回一个 IAsyncResult。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多