WCF

2009-11-12 13 views
8

में प्रोग्रामेटिक रूप से सुरक्षा को कैसे बंद करें मैं पिछले दो दिनों में डब्ल्यूसीएफ के साथ काम कर रहा हूं और यह सर्वर और क्लाइंट के साथ मेरी विकास मशीन पर बहुत अच्छी तरह से चल रहा था। अब जब मैं नेटवर्क पर किसी अन्य मशीन पर क्लाइंट के साथ कुछ वितरित परीक्षण करने की कोशिश कर रहा हूं, तो मैंने समस्याओं में भागना शुरू कर दिया है। अभी त्रुटि मैं हो रही है:WCF

एक्शन 'http://tempuri.org/IWindowUpdateContract/UpdateWindowFrames', रिसीवर प्रोसेस नहीं किया जा सकता है के साथ संदेश EndpointDispatcher पर एक ContractFilter बेमेल की वजह से। यह प्रेषक और रिसीवर के बीच एक अनुबंध विसंगति (प्रेषक और रिसीवर के बीच बेमेल कार्रवाई) या बाध्यकारी/सुरक्षा विसंगति के कारण हो सकता है। जांचें कि प्रेषक और रिसीवर के पास एक ही अनुबंध है और एक ही बाध्यकारी है (सुरक्षा आवश्यकताओं सहित, उदाहरण के लिए संदेश, परिवहन, कोई नहीं)।

यह पहले से ही एक बड़े पैमाने पर शिक्षण अनुभव है जैसा कि मैंने शिक्षण उपकरण को विकसित करने के लिए जारी रखने और सुरक्षा पर फिर से जब मैंने रिपोर्ट कर (मैं कोई इरादा नहीं है करना चाहते हैं (मैं किसी भी दूरस्थ, RPC, एट अल से पहले नहीं किया है) कुछ भी निर्माण करने के लिए जो वास्तव में उचित सुरक्षा सर्वोत्तम प्रथाओं के बिना उपयोग किया जाएगा)।

नोट्स:

  • मैं WCF के लिए एक विन्यास फाइल सेटअप नहीं है - मैं सब कुछ प्रोग्राम के रूप में कर रहा हूँ।
  • मेरा नेटवर्क किसी डोमेन का हिस्सा नहीं है इसलिए डिफ़ॉल्ट सुरक्षा सेटिंग्स मेरे लिए काम नहीं कर रही हैं (net.tcp का उपयोग करके)।
  • मैं 'नेट 3.5' का उपयोग कर रहा हूं।

    var svh = new ServiceHost(_serviceImplementation); 
    
        var binding = new NetTcpBinding(); 
    
        binding.ReaderQuotas.MaxArrayLength = 2000000; 
        binding.Security.Mode = SecurityMode.None; 
        binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None; 
        binding.Security.Transport.ProtectionLevel = ProtectionLevel.None; 
        binding.Security.Message.ClientCredentialType = MessageCredentialType.None; 
    
        svh.AddServiceEndpoint(_serviceInterface, binding, string.Format("net.tcp://{0}:{1}", _endPoint.Address, _endPoint.Port)); 
    
        _stopFlag = new AutoResetEvent(false); 
    
        svh.Open(); 
    
        _stopFlag.WaitOne(); 
    

    और मेरे मुवक्किल को इस तरह बनाया गया है:

मेरे सर्वर इस तरह बनाई गई है

var binding = new NetTcpBinding(); 

    binding.ReaderQuotas.MaxArrayLength = 2000000; 
    binding.Security.Mode = SecurityMode.None; 
    binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None; 
    binding.Security.Transport.ProtectionLevel = ProtectionLevel.None; 
    binding.Security.Message.ClientCredentialType = MessageCredentialType.None; 

    var scf = new ChannelFactory<IUserInputContract>(binding, "net.tcp://192.168.0.42:8001"); 
    _uiUpdateServer = scf.CreateChannel(); 

और मेरे अनुबंध (जो सिर्फ इतना है कि के रूप में जोड़ा जाता है एक वर्ग पुस्तकालय में है क्लाइंट और सर्वर दोनों का संदर्भ) है:

[ServiceContract(ProtectionLevel = ProtectionLevel.None)] 
    public interface IWindowUpdateContract { 
     [OperationContract] 
     void UpdateWindowFrames(WindowFrame frame); 
     [OperationContract] 
     void WindowHasClosed(IntPtr hwnd); 
} 

मैं फ़ ईल कि बाध्यकारी और अनुबंध सेटअप मैंने किया है उन्हें समान बनाना चाहिए और मुझे यह समस्या नहीं होनी चाहिए (और सुरक्षा बंद कर दी जानी चाहिए)। मुझे नहीं पता कि अब कहाँ जाना है।

उत्तर

10

मैं आपसे सहमत हूं - ऐसा लगता है कि सर्वर और क्लाइंट दोनों के लिए सुरक्षा सेटिंग्स समान हैं।

पक्ष पर एक नोट: एक बार आप कार्य करें:

binding.Security.Mode = SecurityMode.None; 

मैं तुम्हें "binding.Security" वस्तु या नीचे पर किसी भी अधिक सेटिंग निर्दिष्ट करने की आवश्यकता नहीं लगता कि - उन अतिरिक्त लाइनें उस के बाद कर रहे हैं जरूरत नहीं। कि असामान्य है -

[ServiceContract(ProtectionLevel = ProtectionLevel.None)] 
public interface IWindowUpdateContract 
{ 
    [OperationContract] 
    void UpdateWindowFrames(WindowFrame frame); 
    [OperationContract] 
    void WindowHasClosed(IntPtr hwnd); 
} 

उन संचालन कुछ भी वापस नहीं है:

क्या मेरी नजर पड़ी आपकी सेवा अनुबंध है। डब्ल्यूसीएफ सेवा के लिए डिफ़ॉल्ट व्यवहार अनुरोध/प्रतिक्रिया है - आप एक अनुरोध भेजते हैं और प्रतिक्रिया वापस लेते हैं।

या तो उन्हें कुछ (एक स्थिति या ऐसी; एक स्ट्रिंग, एक int की तरह) वापस कर दें, या फिर आपको उन्हें "एक तरफा" कॉल के रूप में चिह्नित करने की आवश्यकता होगी ताकि डब्ल्यूसीएफ को कुछ भी वापस आने की आवश्यकता न हो:

[ServiceContract(ProtectionLevel = ProtectionLevel.None)] 
public interface IWindowUpdateContract 
{ 
    [OperationContract(IsOneWay=true)] 
    void UpdateWindowFrames(WindowFrame frame); 
    [OperationContract(IsOneWay=true)] 
    void WindowHasClosed(IntPtr hwnd); 
} 

मार्क

+0

मैं 'IsOneWay' विशेषता जोड़ने की कोशिश की और मैं भी एक लाइन आप का उल्लेख के लिए बाध्य कोड कम और बातें अब काम कर रहे हैं। आपकी मदद के लिए बहुत बहुत धन्यवाद! मुझे यह थोड़ा अजीब लगता है कि उन दो चीजों में से कोई भी उस विशिष्ट त्रुटि के कारण हो सकता है ... लेकिन मैंने कुछ और नहीं बदला और अब यह काम करता है! – InvertedAcceleration

+0

@curiouscoder: मुझे विश्वास है कि यह IsOneWay = सत्य सेटिंग्स है जिसने अंतर बनाया है। –

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