我得到了很奇怪的例外:
类型' 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模型中吗?
答案 0 :(得分:1)
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不支持同步方法,因此您的应用程序不支持它们。
如果要使用它,或者更改方法以遵循异步模式或更改项目类型以使用共享项目,则共享项目不使用可移植类配置文件,并且可以使用完整框架。