2013-04-17 7 views
4

Как указано в статье this, в .net можно связать веб-службу со всеми IP-адресами, используя «адрес» 0. Однако это, похоже, не работает с моно (версия 2.10.8.1).Моно и WCF Net.Tcp Связывание во всех IP-адресах

Вот мой пример кода:

Клиент:

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 (Raspberry Pi, Debian soft-float) сервис запускается без каких-либо проблем, однако клиент не может подключиться.
Если я размещаю услугу с ее IP-адресом, а не с адресом «0», все работает правильно.

Это просто еще одна ошибка в моно или мне нужно привязать к любому другому ip-адресу вместо 0? Если это ошибка в моно, есть ли какие-нибудь обходные пути?

(Кстати, я все еще ищет для обхода проблем совместного использования порта с моно/net.tcp, если кто-то может помочь здесь ->net.tcp port sharing and mono)

ответ

0

Попробуйте использовать + или * вместо от 0 для привязки ко всем адресам.

Edit: Или попробуйте 0.0.0.0

edit2: Похоже, ошибка в Mono. Вы можете сообщить об этом в https://bugzilla.xamarin.com/index.cgi

+0

С * вместо 0 я получаю: 'необработанное исключение: System.Net.Sockets.SocketException: Нет такого хозяина не known', С + я получаю:' Необработанное исключение: System.UriFormatException: Invalid URI: Имя хоста не удалось разобрать. ' – bema

+0

Вместо этого попробуйте' 0.0.0.0'. – PhonicUK

+0

с 0.0.0.0 Я получаю: 'Unhandled Exception: System.ArgumentException: Адреса 0.0.0.0 (IPv4) и :: 0 (IPv6) являются неуказанными адресами. Вы не можете использовать их в качестве целевого адреса. «Спасибо за ваш очень быстрый ответ кстати :) – bema

0

У меня была аналогичная проблема в Ubuntu Server 16.04 LTS & Mono JIT компилятор версии 5.0.1.1 (2017-02/5077205 чт 25 май 9:19:18 UTC 2017).

Я получил его решить, добавив следующую строку в /etc/hosts:

0.0.0.0 IP4Any

Тогда конечно, привязать услугу IP4Any.