C# 所有IP地址上的Mono和WCF Net.Tcp绑定

C# 所有IP地址上的Mono和WCF Net.Tcp绑定,c#,wcf,mono,net.tcp,C#,Wcf,Mono,Net.tcp,如本文所述,在.net中,可以使用“地址”0将web服务绑定到所有ip地址。但是,这似乎不适用于mono(版本2.10.8.1) 下面是我的示例代码: 客户: string ipAddressOfTheService = "192.168.0.23"; EndpointAddress address = new EndpointAddress(string.Format("net.tcp://{0}:8081/myService", ipAddressOfTheService)); NetTcp

如本文所述,在.net中,可以使用“地址”0将web服务绑定到所有ip地址。但是,这似乎不适用于mono(版本2.10.8.1)

下面是我的示例代码:

客户:

string ipAddressOfTheService = "192.168.0.23";
EndpointAddress address = new EndpointAddress(string.Format("net.tcp://{0}:8081/myService", ipAddressOfTheService));
NetTcpBinding binding = new NetTcpBinding();
ServiceProxy proxy = new ServiceProxy(binding, address);
if(proxy.CheckConnection())
{
    MessageBox.Show("Service is available");
}
else
{
    MessageBox.Show("Service is not available");
}
ServiceProxy:

public class ServiceProxy : ClientBase<IMyService>, IMyService
{
    public ServiceProxy(Binding binding, EndpointAddress address)
        : base(binding, address)
    {
    }

    public bool CheckConnection()
    {
        bool isConnected = false;
        try
        {
            isConnected = Channel.CheckConnection();
        }
        catch (Exception)
        {
        }
        return isConnected;
    }
}
我的服务:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    bool CheckConnection();
}
class MyService : IMyService
{
    public bool CheckConnection()
    {
        Console.WriteLine("Check requested!");
        return true;
    }
}
服务主机:

class MyServiceHost
{
    static void Main(string[] args)
    {
        Uri baseAddress = new Uri(string.Format("net.tcp://0:8081/myService");
        using (ServiceHost host = new ServiceHost(typeof(MonitoringService), baseAddress))
        {
            NetTcpBinding binding = new NetTcpBinding();
            binding.Security.Mode = SecurityMode.None;

            host.AddServiceEndpoint(typeof(IMyService), binding, baseAddress);
            host.Open();
            Console.WriteLine("The service is ready at {0}", baseAddress);
            Console.WriteLine("Press <Enter> to stop the service.");
            Console.ReadLine();
            host.Close();
        }
    }
}
类MyServiceHost
{
静态void Main(字符串[]参数)
{
Uri baseAddress=newURI(string.Format(“net.tcp://0:8081/myService”);
使用(ServiceHost主机=新ServiceHost(类型(监视服务),基地址))
{
NetTcpBinding=新的NetTcpBinding();
binding.Security.Mode=SecurityMode.None;
AddServiceEndpoint(typeof(IMyService)、binding、baseAddress);
host.Open();
WriteLine(“服务在{0}处准备就绪”,基地址);
控制台。WriteLine(“按以停止服务”);
Console.ReadLine();
host.Close();
}
}
}
如果我使用.net在windows PC上运行此(服务和客户端),一切正常。
在我的Linux机器(Raspberry Pi、Debian soft float)上,服务启动时没有任何问题,但是客户端无法连接。
如果我使用服务的ip地址而不是“0”地址托管服务,则一切正常

这只是mono中的另一个bug,还是我必须绑定到任何其他ip地址而不是0? 如果是mono中的一个bug,有什么解决方法吗


(顺便说一句,我仍在寻找解决mono/net.tcp端口共享问题的方法,如果这里有人能帮忙的话->)

尝试使用
+
*
而不是
0
绑定到所有地址

编辑:或尝试
0.0.0.0


Edit2:看起来Mono中有一个bug。你可以在

上报告。我在Ubuntu服务器16.04 LTS和Mono JIT编译器版本5.0.1.1(2017-02/5077205 Thu May 25 09:19:18 UTC 2017)中遇到类似问题

我通过在
/etc/hosts
中添加以下行来解决此问题:

0.0.0.0 IP4Any


当然,然后使用*而不是0将服务绑定到
IP4Any

,I get:
未处理的异常:System.Net.Sockets.SocketException:没有已知的此类主机,使用+I get:
未处理的异常:System.UriFormatException:无效的URI:无法解析主机名。
使用0.0.0时,I get:
未处理的异常on:System.ArgumentException:地址0.0.0.0(IPv4)和::0(IPv6)是未指定的地址。您不能将它们用作目标地址。
谢谢您快速的回答:)您运行的是哪一版本的Mono?哦,抱歉,我完全错过了。Mono版本是2.10.8.1,听起来就像Mono中的一个bug。您可以在报告-确保包含测试用例!