单声道和WCF网.Tcp所有IP地址绑定

本文关键字:所有 Tcp IP 地址 绑定 WCF 声道 单声道 | 更新日期: 2023-09-27 18:09:31

如本文所述,在。net中可以使用"address" 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;
    }
}

IMyService:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    bool CheckConnection();
}

MyService:

class MyService : IMyService
{
    public bool CheckConnection()
    {
        Console.WriteLine("Check requested!");
        return true;
    }
}

ServiceHost:

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();
        }
    }
}

如果我在windows PC上使用。net运行这个(服务和客户端),一切都很好。
在我的Linux机器上(树莓派,Debian软浮动),服务启动没有任何问题,但是客户端无法连接。如果我用它的ip地址而不是"0"地址来托管服务,一切都能正常工作。

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

(顺便说一下,我仍然在寻找一个解决方案与mono/net端口共享问题。Tcp,如果有人能帮忙的话-> net。TCP端口共享和mono)

单声道和WCF网.Tcp所有IP地址绑定

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

编辑:或者试试0.0.0.0

编辑2:看起来像一个bug在Mono。您可以在https://bugzilla.xamarin.com/index.cgi

报告它。

我在Ubuntu Server 16.04 LTS中遇到了类似的问题;Mono JIT编译器版本5.0.1.1(2017-02-5077205星期四5月25日09:19:18 UTC 2017).

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

0.0.0.0 IP4Any

当然,还要绑定IP4Any

让WCF在Mono上通过netttcpbinding工作的教程

要在Mono中使用WCF的IP地址,您需要在/etc/hosts. .文件中写入域名这样你就可以使用IP地址来连接主机和客户端。

如何写domain:在主机上打开/etc/hosts文件,添加IP.address.of.host HostName