【发布时间】: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