wcf - शत्रु मारण शाबर मंत्र




डब्ल्यूसीएफ और पुष्टिकरण-क्या मुझे क्लाइंट को 'ओके मिल गया है' वापस भेजने की आवश्यकता है? (3)

अगर मेरे सर्वर पर सैकड़ों / हजारों क्लाइंट कंप्यूटर हैं, तो क्या मुझे '200 ओके' प्रकार के संदेश के साथ जवाब देना चाहिए कि मैं डेटा प्राप्त कर चुका हूं और इसे डीबी में सफलतापूर्वक संग्रहीत किया है?

क्या यह पहले से ही WCF में निर्मित है?


आप ऐसा कर सकते हैं 2 तरीके हैं - सफलता या विफलता का संकेत, अपने डब्ल्यूसीएफ कॉल से एक मूल्य लौटाएं या सफलता की कल्पना करें और अगर कोई समस्या है तो ग्राहक को बताने के लिए कॉलबैक का उपयोग करें।

मेरी प्राथमिकता एक द्वैध सेवा के साथ एक-तरफा सेवा कॉल का उपयोग करने के लिए होगी और सेवा के लिए कॉलबैक अनुबंध का उपयोग करने के लिए ग्राहक को विफलता के बारे में सूचित करने के लिए होगा। यहां और यहां कॉलबैक अनुबंधों का अच्छा वर्णन है

मुझे लगता है कि यदि आप दूसरे मार्ग का अनुसरण करते हैं, तो आपको एक अच्छा, अधिक अतुल्यकालिक वास्तुकला प्राप्त होता है, लेकिन साधारण अनुप्रयोगों के लिए सिर्फ सफलता या विफलता लौटाना आसान हो सकता है


डिफ़ॉल्ट रूप से आपकी सेवा ग्राहक को "ओके" संदेश लौटाएगी (भले ही आपकी सेवा पद्धति शून्य वापसी प्रकार निर्दिष्ट करती है) जब तक कोई अपवाद फेंका नहीं जाता है। क्लाइंट तब तक प्रतीक्षा करेगा जब तक कि यह इस जीवन को जारी रखने से पहले इस संदेश को प्राप्त न करे।

इसलिए आपके प्रश्न के आधार पर आपको वह व्यवहार मिल रहा है, जिसे आप डिफ़ॉल्ट रूप से चाहते हैं।

यदि आप यह नहीं चाहते हैं, तो मैं झिझक से सहमत हूं और आपके ऑपरेशन को एक तरफ (आपके ऑपरेशन अनुबंध में एक सेटिंग) के रूप में चिह्नित कर सकता हूं।

सौभाग्य!


यहां वर्णित तीन संदेश पैटर्न हैं:

  1. तुल्यकालिक अनुरोध-प्रतिक्रिया
  2. असिंक्रोनस भेजें (आग और एक-तरफा सेवा के साथ भूल जाएं)
  3. अतुल्यकालिक अनुरोध-प्रतिक्रिया (एक-तरफा सेवा के साथ डुप्लेक्स सेवा कॉल)

सभी तीन अलग-अलग संदेश भेजने के व्यवहार को प्रदर्शित करते हैं, और उपयोग किए जाने वाले पैटर्न को आपकी आवश्यकताओं के आधार पर चुना जाना चाहिए।

डाटा को डाटाबेस में कायम रखने के लिए क्लाइंट को सफलता देने की आपकी आवश्यकता के लिए विकल्प 1 या 3 उपयुक्त हैं।

विकल्प 1

यह डिफ़ॉल्ट कॉन्फ़िगरेशन है

सेवा के सभी कार्यों को पूरा करने के बाद यह एक ही HTTP कनेक्शन पर 200 प्रतिक्रिया देता है इसका मतलब यह है कि प्रतिक्रिया के लिए इंतजार करते समय सेवा को कॉल ब्लॉक कर देगा - जब तक ग्राहक ने सेवा को डेटाबेस में लिखा न हो, तब तक आपकी ग्राहक लटकाएगा और किसी और चीज की आवश्यकता होगी।

विकल्प 2

जब तक ट्रांसपोर्ट लेयर और मैसेजिंग इंफ्रास्ट्रक्चर लेयर सफल होता है तब तक 202 प्रतिक्रिया देता है। 202 वापस संकेत मिलता है कि संदेश स्वीकार किया गया है। Http rfc से :

प्रसंस्करण के लिए अनुरोध स्वीकार किया गया है, लेकिन प्रसंस्करण पूरा नहीं हुआ है। (...) 202 प्रतिक्रिया जानबूझकर गैर-प्रतिबद्ध है।

इसका मतलब यह है कि आपका ग्राहक सेवा निष्पादन सफलतापूर्वक सेवा शुरू करने के बाद ही निष्पादन जारी रखेगा, और आपको इस बारे में कोई जानकारी नहीं मिलेगी कि क्या डेटाबेस कॉल सफल है या नहीं।

विकल्प 3

विकल्प 2 के समान, प्रतिक्रिया एक 200 202 नहीं है, लेकिन अब जब आप क्लाइंट से सेवा कॉल करते हैं तो आप एक InstanceContext ऑब्जेक्ट प्रदान करते हैं जो ऑब्जेक्ट को कॉल बैक को संभालने के लिए निर्दिष्ट करता है। क्लाइंट नियंत्रण को पुनः प्राप्त करता है और एक नया थ्रेड सफलता या विफलता के बारे में सूचित सेवा प्रतिक्रिया के लिए अतुल्यकालिक प्रतीक्षा करता है।

नीचे WCF में इन पैटर्न को लागू करने के बारे में कुछ और जानकारी दी गई है। इसे लिखने के बाद, यह बहुत लंबा है लेकिन कुछ उपयोगी कड़ी के साथ-साथ कोड भी हैं।

जैसा कि झिस्से का उल्लेख किया गया, जुवाल लोवी का एक लेख इस विस्तार (और अधिक!) को कवर करता है

विकल्प 1

यह WCF में डिफ़ॉल्ट व्यवहार है, इसलिए आपको कुछ भी करने की आवश्यकता नहीं है - यह कई अलग-अलग बाइंडिंग के साथ काम करता है जिसमें wsHttpBinding और basicHttpBinding शामिल है।

एक बात ध्यान देने योग्य है कि आपके ग्राहक द्वारा 200 प्रतिक्रियाओं के इंतजार के इंतजार में लटकाए गए व्यवहार के बारे में बताया गया है, भले ही आपके पास एक शून्य ऑपरेशन है जैसे:

[ServiceContract]
interface IMyServiceContract
{
    [OperationContract]       
    void DoSomeThing(InputMessage Message);
}

विकल्प 2

आपरेशन को एक तरफा के रूप में सेट करने के लिए बस इसे सजाने के लिए:

[ServiceContract]
interface IMyServiceContract
{
    [OperationContract(IsOneWay = true)]       
    void DoSomeThing(InputMessage Message);
}

इस तरीके से सजाए गए तरीके में केवल एक वापसी प्रकार का शून्य होना चाहिए। एक पकड़ लिया यह है कि सेवा खुशी से निर्मित होगी और आपको यह अपवाद नहीं मिलेगा कि सेवा कॉन्फ़िग तब तक अमान्य है जब तक आप इसे कनेक्ट नहीं करते हैं।

विकल्प 3

डुप्लेक्स कॉलबैक सेवा बनाने के लिए इंटरफ़ेस कोड है:

[ServiceContract(CallbackContract = typeof(IMyContractCallback))]
interface IMyContract
{
    [OperationContract(IsOneWay=true)]       
    void DoSomeThing(InputMessage Message);
}

public interface IMyContractCallback
{
    [OperationContract(IsOneWay = true)]
    void ServiceResponse(string result);      
}

और क्लाइंट पक्ष पर आपको कॉलबैक सेट करने के लिए ऐसा कुछ चाहिए:

public class CallbackHandler : IMyContractCallback        
{
    #region IEchoContractCallback Members

    public void ServiceResponse(string result)
    {
        //Do something with the response
    }

    #endregion
}

// And in the client when you set up the service call:

InstanceContext instanceContext = new InstanceContext(new CallbackHandler());
MyContractClient client = new MyContractClient(instanceContext);

InputMessage msg = new InputMessage();

client.DoSomething(msg);           

सेवा में आपको शायद कुछ कोड होंगे:

class MyContractImplementation : IMyContract
{
    public void DoSomeThing(MyMessage Message)
    {

        string responseMessage;

        try
        {
           //Write to the database
           responseMessage = "The database call was good!";
        }
        catch (Exception ex)
        {
            responseMessage = ex.Message;
        }

        Callback.ServiceResponse(responseMessage);
    }
}

एक महत्वपूर्ण बात यह है कि पहले मुझे पकड़ लिया, अपवादों के बारे में सावधान रहना है। अगर तुम:

  • एक अपवाद खाएं, आपको त्रुटि की कोई चेतावनी नहीं मिलेगी (लेकिन कॉलबैक होगा)

  • एक अप्रतिबंधित अपवाद फेंक दें, सेवा समाप्त हो जाएगी और क्लाइंट को कॉलबैक भी नहीं मिलेगा।

यह विकल्प 1 के साथ तुलना में इस विधि का एक बड़ा नुकसान है, विकल्प 1 अपवाद वापस करेगा जब एक अप्रयुक्त अपवाद फेंक दिया जाता है।







confirmation