2010-12-26 13 views
11

डब्ल्यूसीएफ नौसिखिया यहाँ ... मैं NetTcp बाइंडिंग का उपयोग कर एक डब्ल्यूसीएफ सेवा को स्वयं होस्ट करने की कोशिश कर रहा हूं। MSDN "how-to" tutorial मैंने किया है के आधार पर सभी कोड है, जो मैं तो NetTcpBinding को WsHttpBinding से बदल गया है, और अब में बाध्यकारी इस तरह दिखता है:क्या आप कोड में NetTcp बाइंडिंग कर सकते हैं? अगर आप?

var baseAddress = new Uri("net.tcp://localhost:8000/MyWebService"); 
var selfHost = new ServiceHost(typeof(ConcreteWebService), baseAddress); 
try { 
    var binding = new NetTcpBinding(); 
    binding.Security.Mode = SecurityMode.Message; 
    selfHost.AddServiceEndpoint(typeof(IWebService), binding, "TRWebService"); 
    selfHost.Open(); 
    Console.WriteLine("The service is ready at {0}", baseAddress.AbsoluteUri); 
    Console.WriteLine("Press <ENTER> to terminate service."); 
    Console.WriteLine(); 
    Console.ReadLine(); 

    selfHost.Close(); 
} catch (CommunicationException ce) { 
    Console.WriteLine("An exception occurred: {0}", ce.Message); 
    selfHost.Abort(); 
} 

बात है, ट्यूटोरियल तो कहते हैं कि आप के लिए svcutil.exe चलाने के लिए है क्लाइंट के लिए प्रॉक्सी उत्पन्न करें ... लेकिन जब से मैं NetTcp बाइंडिंग पर स्विच करता हूं, svcutil अब और काम नहीं करता है - मेरी सेवा का पता नहीं लगा सकता है। मैंने इस मुद्दे को गुमराह किया, और पाया कि NetTcp बाइंडिंग के बाहर हर एक उदाहरण ऐप.कॉन्फिग फ़ाइल में सेटअप करता है, कोड में नहीं, और वे सभी "mexTcp बाइंडिंग" के बाध्यकारी प्रकार के साथ "मेक्स" नामक एक एंडपॉइंट जोड़ते हैं। कोड में इसका कोई समकक्ष प्रतीत नहीं होता है।

तो, क्या मुझे अपनी परियोजना को app.config का उपयोग करने के लिए बदलना है, और कोड-आधारित दृष्टिकोण को छोड़ देना है? क्या कोई मुझे बता सकता है कि मैक्स क्या है, मुझे इसकी आवश्यकता क्यों है, और क्यों (स्पष्ट रूप से) कोड में नहीं कहा जा सकता है - या यदि यह कर सकता है, कैसे, या क्यों इसे निराश किया जाता है? आम तौर पर, app.config का उपयोग करना बेहतर होता है, और जब डब्ल्यूसीएफ सेवाओं के लिए कोड होता है?

+0

मैं सटीक उसी ट्यूटोरियल का पालन कर रहा था और कॉलबैक अनुबंध चाहता था, इसलिए जब मैंने टीसीपी पर स्विच किया तो मुझे एक ही समस्या थी। – bryanbcook

उत्तर

17

यदि आप netTcpBinding का उपयोग करते हैं - और "पीछे-द-कॉरपोरेट-फ़ायरवॉल" लैन पर्यावरण में, यह निश्चित रूप से ऐसा करने का एक अच्छा विचार है - आपको mexTcpBinding का उपयोग करके एक मेक्स एंडपॉइंट (मेटाडाटा एक्सचेंज) का पर्दाफाश करने की आवश्यकता है svcutil के लिए उस सेवा को पहचानने और ढूंढने में सक्षम होने के लिए।

एमएक्स = मेटाडाटा एक्सचेंज वह तंत्र है जो डब्ल्यूसीएफ एक सार्वजनिक रूप से विज्ञापित करने के लिए "सार्वजनिक रूप से विज्ञापन" करने के लिए उपयोग करता है। यदि आपके पास एक एमईएक्स एंडपॉइंट है, तो svcutil जैसी सुविधाएं उपयोग कर सकती हैं और सेवा को "खोज" सकती हैं, उदा। उन सभी मापदंडों के बारे में पता लगाएं जो इसके सामने आने वाले मानकों के बारे में बताते हैं।

एक मेक्स एंडपॉइंट जोड़ने के लिए, आप निश्चित रूप से कोड का भी उपयोग कर सकते हैं! इस टुकड़ा की तरह कुछ:

var mexBinding = MetadataExchangeBindings.CreateMexTcpBinding(); 
selfHost.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex"); 
MEX बिना

, तो आप किसी भी तरह "बता" करने के लिए ग्राहक आपकी सेवा का उपभोग करने के यह क्या आपकी सेवा प्रदान करता है ताकि ग्राहक उचित साथ उचित तरीके कॉल करने के लिए सुनिश्चित कर सकते है की कोशिश कर रहा जरूरत मापदंडों।

+0

+1 स्पष्टीकरण के लिए धन्यवाद! कोड में app.config बनाम सेट अप करने के बारे में क्या? –

+0

@ शाहुल: app.config आपको अधिक लचीलापन देता है - आप इसे अपने कोड को बदलने और पुन: संकलित किए बिना मूल एचटीपी बाइंडिंग में बदल सकते हैं - लेकिन इसके अलावा, कोड में इसे ठीक करना ठीक है। अपनी जरूरतों के अनुरूप जो भी उठाओ! –

+0

धन्यवाद .. महान जवाब। – Prasanth

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