2012-12-27 7 views
6

この単純なWCF検出の例は1台のマシンで動作しますが、それは動作しません。私は何が欠けていますか?ファイアウォールをオフにして同じサブネット上の2台のコンピュータ間でWCF検出が機能しない

using System; 
using System.Linq; 
using System.Net; 
using System.Net.Sockets; 
using System.ServiceModel; 
using System.ServiceModel.Discovery; 

namespace WCFDiscovery 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     try { if (args.Length > 0) StartClient(); else StartServer(); } 
     catch (Exception ex) { Console.WriteLine(ex); } 
     finally { Console.WriteLine("press enter to quit..."); Console.ReadLine(); } 
     } 

     private static void StartServer() 
     { 
     var ipAddress = Dns.GetHostAddresses(Dns.GetHostName()).First(ip => ip.AddressFamily == AddressFamily.InterNetwork); 
     var address = new Uri(string.Format("net.tcp://{0}:3702", ipAddress)); 
     var host = new ServiceHost(typeof(Service), address); 
     host.AddServiceEndpoint(typeof(IService), new NetTcpBinding(), address); 
     host.Description.Behaviors.Add(new ServiceDiscoveryBehavior()); 
     host.AddServiceEndpoint(new UdpDiscoveryEndpoint()); 
     host.Open(); 
     Console.WriteLine("Started on {0}", address); 
     } 

     private static void StartClient() 
     { 
     var dc = new DiscoveryClient(new UdpDiscoveryEndpoint()); 
     Console.WriteLine("Searching for service..."); 
     var findResponse = dc.Find(new FindCriteria(typeof(IService))); 
     var response = ChannelFactory<IService>.CreateChannel(new NetTcpBinding(), findResponse.Endpoints[0].Address).Add(1, 2); 
     Console.WriteLine("Service response: {0}", response); 
     } 
    } 

    [ServiceContract] interface IService { [OperationContract] int Add(int x, int y); } 

    class Service : IService { public int Add(int x, int y) { return x + y; } } 
} 
+0

_ "クライアントとサーバーが別々のマシンで動作している場合" _ - 別のアドレスを使用していますか?また:_ "動作しません" _も例外ではありません。正確なメッセージを表示する。 – CodeCaster

+0

サーバーはポート8000​​をリッスンします。「動作しません」とは、「dc.Find(...)」がゼロのエンドポイントを返すため、このコード「Endpoints [0]」がArgumentOutOfRangeExceptionをスローすることです。 – Robin

+1

"localhost"をクライアントが接続するサーバーのIPアドレスに変更しますか? – sclarson

答えて

2

私は2台の異なるマシン(ノートブック(Win7の)とタワー型PC(Win8)、.NET FW 4.5、同じWiFiネットワーク)上のコードを実行し、以下の例外受信しました:

A remote side security requirement was not fulfilled during authentication. Try increasing the ProtectionLevel and/or ImpersonationLevel. 

これは、サービスのセキュリティが不十分で、エンドポイントが見つかりました。だから、他の人の答えは正しい - これはコードを修正することで修正することはできませんネットワークの問題です。 私は、UDPのブロードキャストを許可しないネットワークスイッチかもしれないという問題の可能性のある別の原因を追加したいと思います。

+0

ネットワークスイッチがUDPブロードキャストを許可していないことが判明しました。助けてくれてありがとう。 – Robin

1

明らかに、Windowsファイアウォールもオフになっていますか?

また、他のコンピュータが通信するために使用するアドレスにサーバーをバインドしていることを確認してください。

ローカルホストまたは127.0.0.1は、マルチキャスト検出パケットが到着する外部(ホストへの)アドレス指定可能なIPへの接続を取得しない可能性があります。

MSDN instructions on turning the windows firewall off

+0

はい、コントロールパネルの両方のコンピュータでファイアウォールを手動で無効にしても機能しません。どちらのマシンもWindows 7 with .NET 4.0 – Robin

+0

ハードコード "localhost"ではなく上記のコードを更新しましたが、結果は同じでした。 – Robin

+0

ルータには、このポートをブロックしている別のファイアウォールがありますか?これが当てはまる場合、ポートフォワーディングを検討したいかもしれません。 – vesuvious

関連する問題