在尝试在 Mono 中构建客户端-服务器 WCF 应用程序时,我们遇到了一些问题。将其简化为一个简单的示例,我们发现该服务一次只接受一个客户端。如果另一个客户端尝试连接,它会挂起,直到第一个客户端断开连接。
只需更改为 BasicHttpBinding 即可修复它,但我们需要 NetTcpBinding 进行双工通信。如果在 MS .NET 下编译也不会出现问题。
编辑:我怀疑(也不希望)Mono 不支持我正在尝试做的事情。据我所知,Mono 代码通常会在这种情况下抛出 NotImplementedExceptions。我正在使用 Mono v2.6.4
这是我们的基本场景中服务的打开方式:
public static void Main (string[] args)
{
var binding = new NetTcpBinding ();
binding.Security.Mode = SecurityMode.None;
var address = new Uri ("net.tcp://localhost:8080");
var host = new ServiceHost (typeof(Hello));
host.AddServiceEndpoint (typeof(IHello), binding, address);
ServiceThrottlingBehavior behavior = new ServiceThrottlingBehavior ()
{
MaxConcurrentCalls = 100,
MaxConcurrentSessions = 100,
MaxConcurrentInstances = 100
};
host.Description.Behaviors.Add (behavior);
host.Open ();
Console.ReadLine ();
host.Close ();
}
客户端通道获取方式如下:
var binding = new NetTcpBinding ();
binding.Security.Mode = SecurityMode.None;
var address = new EndpointAddress ("net.tcp://localhost:8080/");
var client = new ChannelFactory<IHello> (binding, address).CreateChannel ();
据我所知,这是一个 Simplex 连接,不是吗?
合同很简单:
[ServiceContract]
public interface IHello
{
[OperationContract]
string Greet (string name);
}
服务实现没有 ServiceModel 标记或属性。
我会根据需要更新详细信息。