4

この記事で述べたように、.net では、「アドレス」0 を使用してすべての IP アドレスに Web サービスをバインドできます。ただし、これは 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");
}

サービスプロキシ:

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

マイサービス:

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

.net を使用して Windows PC でこれ (サービスとクライアント) を実行すると、すべて正常に動作します。
私の Linux マシン (Raspberry Pi、Debian ソフトフロート) では、サービスは問題なく開始されますが、クライアントは接続できません。
「0」アドレスの代わりに IP アドレスを使用してサービスをホストすると、すべてが正しく機能します。

これは mono の別のバグですか、それとも 0 ではなく他の IP アドレスにバインドする必要がありますか? mono のバグである場合、回避策はありますか?

(ちなみに、mono/net.tcp でのポート共有の問題の回避策をまだ探しています。ここで助けてくれる人がいれば -> net.tcp ポート共有と mono )

4

2 に答える 2

0

すべてのアドレスにバインドする代わりに+orを使用してみてください。*0

編集:または試してください0.0.0.0

Edit2: Mono のバグのようです。https://bugzilla.xamarin.com/index.cgiで報告できます。

于 2013-04-17T09:47:05.473 に答える