2012-12-27 6 views
6

यह सरल WCF खोज उदाहरण एक मशीन पर काम करता है, लेकिन बंद कर दिया जब क्लाइंट और सर्वर कोई फ़ायरवॉल के साथ एक ही सबनेट में अलग मशीनों पर चल रहे हैं, यह काम नहीं करता है। मैं क्या खो रहा हूँ?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 (...)" रिटर्न अंतिमबिंदुओं शून्य तो यह कोड "अंतिम बिंदु [0]" एक ArgumentOutOfRangeException – Robin

+1

फेंकता है यह अगर कोई फर्क पड़ता है आप अपने सर्वर के आईपी पते पर "लोकलहोस्ट" बदलते हैं कि आपका ग्राहक कनेक्ट हो जाएगा? – sclarson

उत्तर

2

मैं 2 अलग मशीनों पर अपने कोड (नोटबुक (Win7) और टावर पीसी (Win8), .NET परिवार कल्याण 4.5, एक ही WiFi नेटवर्क) चलाने के लिए और अपवाद निम्नलिखित प्राप्त किया है:

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

यह एक सेवा सुरक्षा को अनिर्धारित होने के कारण है, एंडपॉइंट पाया गया था। तो, अन्य उत्तरों में लोग सही हैं - यह एक नेटवर्क समस्या है जिसे कोड को सही करके तय नहीं किया जा सकता है। मैं जोड़ता हूं कि समस्या का एक और संभावित स्रोत नेटवर्क स्विच यूडीपी प्रसारण की अनुमति नहीं दे सकता है।

+0

नेटवर्क स्विच यूडीपी प्रसारण की अनुमति नहीं दे रहा है। सहायता के लिए धन्यवाद। – Robin

1

स्पष्ट होने के लिए, विंडोज फ़ायरवॉल भी बंद हो गया है?

यह भी सुनिश्चित करें कि आप एक पते कि अन्य कंप्यूटर इसके साथ संवाद करने के लिए उपयोग करता है के लिए अपने सर्वर बाध्यकारी कर रहे हैं।

लोकलहोस्ट या 127.0.0.1 संभवतः बाहरी रूप से (मेजबान) को संबोधित करने योग्य आईपी से कनेक्शन नहीं उठाएगा जो कि मल्टीकास्ट डिस्कवरी पैकेट्स पर पहुंच जाएगा।

MSDN instructions on turning the windows firewall off

+0

हां, मैंने मैन्युअल रूप से नियंत्रण कक्ष में दोनों मशीनों पर फ़ायरवॉल बंद कर दिया है और यह काम नहीं करता है। दोनों मशीनें विंडोज 7 हैं .NET 4.0 – Robin

+0

मैंने उपरोक्त कोड को "लोकलहोस्ट" हार्ड कोड नहीं अपडेट किया लेकिन परिणाम वही था। – Robin

+0

क्या आपके राउटर में एक अलग फ़ायरवॉल है जो इस बंदरगाह को अवरुद्ध कर सकता है? अगर यह मामला है तो पोर्ट अग्रेषण में देखना चाहते हैं। – vesuvious

संबंधित मुद्दे