1

コンテキスト: デモコンソールアプリを作成します。これは、Linux上でモノラルで実行されるWCFサービスと、Windows7上で実行されるコンソールクライアントです。

Linux Versoin:UbuntuとMatch-boxの両方

モノバージョン:2.10.8.1(Ubuntuの場合)および2.10.6(マッチボックスの場合)

問題: クライアントはbasicHttpBindingによってサービスと通信できますが、netTcpBindingとは通信できません

例外情報: net.tcp://192.168.1.220/に接続できませんでした。接続の試行は00:00:14.0408031の期間続きました。TCPエラーコード10060:接続されたパーティが一定期間後に適切に応答しなかったために接続の試行が失敗したか、接続されたホストが192.168.1.220:808に応答しなかったために接続の確立に失敗しました。

サービスコード:

class Program
 {
    static void Main(string[] args)
    { 
        try
        {
            ServiceHost sh = new ServiceHost(typeof(DynIPService.DynIPService));
            //sh.AddServiceEndpoint("DynIPServiceContract.IDynIPService", binding, "net.tcp://10.161.66.213:808");
            sh.Open();
            foreach (var ep in sh.Description.Endpoints)
            {
                Console.WriteLine("Address: {0}, ListenUri: {1}, ListenUriMode: {2} ", ep.Address, ep.ListenUri, ep.ListenUriMode);
            }
            Console.WriteLine("Service is running");               
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error:" + ex.Message);
            throw;
        }
        finally
        {
           Console.ReadKey();
        }
    }
}

サービスapp.config(部分的、ここではエンドポイントとバインディングを一覧表示します)

<services>
  <service name="DynIPService.DynIPService" behaviorConfiguration="MyServiceTypeBehaviors" >
    <endpoint address="net.tcp://127.0.0.1:808"  
              binding="netTcpBinding" bindingConfiguration="TCP_Binding"
              contract="DynIPServiceContract.IDynIPService"/>
    <endpoint address="http://127.0.0.1:123"
              binding="basicHttpBinding" bindingConfiguration="HTTP_Binding"
              contract="DynIPServiceContract.IDynIPService"/>
  </service>
</services>
<bindings>
  <basicHttpBinding>
    <binding name="HTTP_Binding">
      <security mode="None"></security>
    </binding>
  </basicHttpBinding>
  <netTcpBinding>
    <binding  name="TCP_Binding">
      <security mode="None"></security>
    </binding>
  </netTcpBinding>
</bindings> 

クライアントコード:

class Program
 {
    static void Main(string[] args)
    {
        //var ip = "localhost.localdomain";
        var ip = "192.168.1.220";

        //Tcp
        Binding tcpBinding = new NetTcpBinding(SecurityMode.None);
        var tcpUri = new Uri(string.Format("net.tcp://{0}:808", ip));

        //http
        Binding httpBinding = new BasicHttpBinding();  
        var httpUri = new Uri(string.Format("http://{0}:123",ip));

        EndpointAddress address = new EndpointAddress(httpUri.ToString());
        IDynIPService proxy = ChannelFactory<IDynIPService>.CreateChannel(httpBinding, address);
        var hostIP = proxy.ReadHostIp();
        Console.WriteLine(hostIP);
        Console.ReadKey();
    }
}
4

1 に答える 1

1

net.tcpを使用してリモートで接続する場合は、ネットワーク上で公開されているホストマシンのIPアドレスを使用する必要があります。

これをWindowsでテストしたところ、net.tcpとhttpを使用すると、実際には動作が異なり127.0.0.1ます。一方、HTTPは、エンドポイントで使用するIPアドレスに関係なく、常にすべてのインターフェイスでリッスンしているように見えます127.0.0.1。特定のアドレス。

ただし、を使用net.tcp://localhost:<port>/<path>してすべてのインターフェイスでリッスンさせることができます(これは、Mono 2.10.10で実装されました。バグ#275を参照してください)。

したがって、を使用net-tcp://localhost:808/してすべてのインターフェイスをリッスンするか、(またはマシンのIPアドレスが何であれapp.config)を使用して特定のIPアドレス(ネットワーク上で公開されている)に明示的に設定します。net-tcp://192.168.1.200:808/

于 2012-12-02T13:37:04.810 に答える