6

在尝试在 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 标记或属性。

我会根据需要更新详细信息。

4

2 回答 2

3

我已经玩过这个了,它绝对看起来像一个 Mono 错误。

我正在移植一个 WCF 应用程序以在 Mono 中运行。我玩过一些 NetTcpBinding 的东西,但我没有尝试过这种情况(与 Mono 托管服务主机的多个连接)。但是现在我尝试了一下,我能够重现 - 在 2.6 和最新的每日包中。

但是,它确实可以在 .NET 中使用。Mono 和 .NET 之间的任何行为差异都被归类为错误。你应该用测试用例将它记录在 Bugzilla 上,我也会在 Mono 新闻列表中发布。

祝你好运。

于 2010-05-31T20:50:51.340 回答
1

绝对是个bug。我想知道是否有一个版本可以正常工作...

如果您对它的进展感兴趣,我已将它发布在Novell Bugzilla上。

于 2010-06-02T01:41:08.747 回答