2010-08-05 15 views
5

wcf सेवा का उपयोग करने के इन दो तरीकों में से कौन सा बेहतर है? क्यूं कर? सेवा संदर्भ wcf प्रॉक्सी बनाम चैनल फैक्टरी

  • से

    1. जनरेट कर रहा है प्रॉक्सी ChannelFactory

    पूर्व के प्रयोग से।

    ChannelFactory<IMyContract> factory = new ChannelFactory<IMyContract>(); 
    IMyContract proxy1 = factory.CreateChannel(); 
    proxy1.MyMethod(); 
    

    यह थोड़ा so

    IMyContract proxy1 = null; 
    try 
    { 
        proxy1 = factory.CreateChannel(); 
        proxy1.MyMethod(); 
        ((ICommunicationObject)proxy1).Close(); 
    } 
    catch 
    { 
        ((ICommunicationObject)proxy1).Abort(); 
    } 
    

    तरह WCF सेवा को कॉल करने हम हर प्रॉक्सी कॉल के लिए इस स्निपेट को दोहराने चाहिए उबाऊ है? या प्रॉक्सी को बंद करने और निरस्त करने के लिए एक रैपर वर्ग बनाने का सामान्य तरीका है?

    इस ServiceExecution.Execute(proxy=>proxy.MyMethod()); जैसी कक्षा लिख ​​रहा है जो प्रॉक्सी बनाता है, और इसे करने के लिए इसे बंद करने या बंद करने का अच्छा तरीका है?

  • उत्तर

    3

    Here एक एमएसडीएन पोस्ट है, जो नेट 3 में उत्पन्न प्रॉक्सी का उपयोग न करने की सिफारिश करता है क्योंकि यह प्रत्येक बार चैनलफैक्टरी बनाता है, नेट 3।5 चैनल फैक्ट्री कैश किया गया है।

    लेकिन व्यक्तिगत रूप से मैं अपने आप को ChanelFactory उपयोग करने के लिए पसंद करते हैं, उत्पन्न कोड हमेशा एक दर्द है के बाद भी partials बाहर आ

    2

    पहली बार जब आप सेवा संदर्भ जोड़ने के लिए वीएस का उपयोग करते हैं तो यह सेवाकंट्रैट्स और डेटाकंट्रैक्ट सहित आपके लिए सभी कोड उत्पन्न करता है।

    लेकिन जब आप ChannelFactory का उपयोग करते हैं तो आपके पास पहले से ही क्लाइंट पक्ष पर सेवा अनुबंध और आदि होना चाहिए।

    +0

    मुझे पता है, लेकिन डेटा ठेके उत्पन्न उपयोग करने के लिए सहज नहीं है। मान लें कि हमारे पास 2 सेवाएं हैं जो पहली बार डेटाकंट्रेट लौटाती हैं जिसे पैरामीटर के रूप में दूसरे को पारित किया जाना चाहिए। इस मामले में हमें डेटाकंट्रैक्ट को मैन्युअल रूप से प्रतिलिपि बनाना चाहिए, क्योंकि डेटाकंट्रैक्ट 2 अलग-अलग नामस्थानों में मौजूद है –

    +0

    आप अभी भी वीएस द्वारा उत्पन्न कोड को संपादित कर सकते हैं। और आप एक अलग डेटाकंट्रैक्ट कर सकते हैं। – Incognito

    +0

    किसी भी सेवा परिवर्तन और प्रॉक्सी पुनर्जन्म के बाद आपका संपादन खो जाएगा? –

    2

    मैं दृष्टिकोण 1.

    उपयोग करने का सुझाव मैं स्रोत कोड भी बताते हैं कि कैसे ठीक कनेक्शन को संभालने के लिए (समापन, रद्द किया, आदि) सहित एक उदाहरण के साथ इस blog पाया है। ब्लॉग में एमएसडीएन में अधिक जानकारी के लिए लिंक भी शामिल हैं।

    +1

    ब्लॉग सिर्फ यह बताता है कि इसे पहले दृष्टिकोण में कैसे किया जाए, लेकिन दूसरा एक बनाम फायदे नहीं कहता है। –

    +0

    @ArsenMkrt: हाँ, आप सही हैं। मैंने एक ब्लॉग एंट्री के लिए एक लिंक जोड़ा जो मेरे उत्तर में सुझाए गए दृष्टिकोण के बारे में अधिक जानकारी प्रदान करता है। :-) – Manfred

    0

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

    उदाहरण के लिए, TestService बुलाया पोर्ट 8000 पर स्थानीय रूप से चल रहा है एक सेवा के लिए एक प्रॉक्सी उत्पन्न करने के लिए, आप चल पाएंगे दृश्य स्टूडियो कमांड प्रॉम्प्ट में निम्नलिखित, प्रॉक्सी निर्देशिका में एक प्रॉक्सी वर्ग TestServiceProxy.cs पैदा होता है।

    cd "C:\src\proxies" 
    svcutil /noLogo /out:TestServiceProxy http://localhost:8000/TestService 
    

    वहाँ उपकरण के लिए कुछ अन्य उपयोगी मापदंडों उदाहरण के लिए, कर रहे हैं:

    /n:*,WcfServices.TestService जोड़े प्रॉक्सी वर्ग के लिए एक नाम स्थान निर्दिष्ट करेगा।

    /config:TestServiceProxy.config जोड़ें और svcutil अंतिमबिंदुओं, बाइंडिंग आदि

    /r:"Common.dll" जोड़ें और प्रॉक्सी वर्ग svcutil द्वारा उत्सर्जित सेवा द्वारा उपयोग किया प्रकार के लिए परिभाषाओं की ज़रूरत नहीं होगी सहित TestService प्रयोग करने के लिए एक नमूना विन्यास फाइल उत्पन्न होगा, लेकिन में परिभाषित किया गया असेंबली Common.dll।

    अधिक जानकारी के लिए svcutil /? का उपयोग करें।

    +0

    '/ config': यह वैसे भी इसे डिफ़ॉल्ट नाम output.config के साथ उत्पन्न करेगा। – Rup

    +0

    svcutil कॉन्फ़िगरेशन के साथ सभी व्यावसायिक मामले संभव नहीं हैं, उदाहरण के लिए, अलग-अलग प्रोजेक्ट में डेटाकंट्रैक्ट उत्पन्न करना, अलग-अलग सर्विसकैक्ट, और प्रॉक्सी अलग-अलग हो सकता है? मुझे कोई अनुमान नहीं है। –

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