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.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)]
有关更多信息,请参阅:此处