2012-11-02 9 views
11

से बाहर निकाला जा रहा है, मैं एक WinRT ऐप से डब्ल्यूसीएफ सेवा को कॉल कर रहा हूं। सेवा की आवश्यकता है कि कुछ शीर्षलेख प्रमाणीकरण के लिए सेट हैं।Async WCF क्लाइंट कस्टम हेडर के साथ कॉल करता है: यह ऑपरेशन कॉन्टेक्स्टस्कोप ऑर्डर

यह OperationContextScope आदेश से बाहर निपटारा किया जा रहा है: समस्या यह है कि अगर मैं सेवा एक साथ को एकाधिक कॉल करते हैं, मैं निम्नलिखित अपवाद हो रही है।

वर्तमान कोड ऐसा दिखाई देता है:

अतुल्यकालिक का प्रयोग न करें "का इंतजार है" एक OperationContextScope ब्लॉक के भीतर पैटर्न:

public async Task<Result> CallServerAsync() 
{ 
    var address = new EndpointAddress(url); 
    var client = new AdminServiceClient(endpointConfig, address); 

    using (new OperationContextScope(client.InnerChannel)) 
    { 
     OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = GetHeader(); 

     var request = new MyRequest(...); 
     { 
      context = context, 
     }; 

     var result = await client.GetDataFromServerAsync(request); 
    } 
} 

मैं निम्नलिखित टिप्पणी from the docs पाया। जब निरंतरता होती है, तो यह एक अलग थ्रेड पर चल सकती है और ऑपरेशन कॉन्टेक्स्टस्कोप थ्रेड विशिष्ट है। यदि आपको एसिंक कॉल के लिए "प्रतीक्षा" करने की आवश्यकता है, तो इसे ऑपरेशन कॉन्टेक्स्टस्कोप ब्लॉक के बाहर उपयोग करें।

तो ऐसा लगता है कि मैं स्पष्ट रूप से सेवा को गलत तरीके से बुला रहा हूं। लेकिन सही तरीका क्या है?

उत्तर

4

सब कुछ निम्न कोड के साथ बहुत अच्छी तरह से काम करने के लिए लगता है:

public async void TestMethod() 
{ 
    var result = await CallServerAsync(); 
} 

public Task<Result> CallServerAsync() 
{ 
    var address = new EndpointAddress(url); 
    var client = new AdminServiceClient(endpointConfig, address); 

    using (new OperationContextScope(client.InnerChannel)) 
    { 
     OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = GetHeader(); 

     var request = new MyRequest(...); 
     { 
      context = context, 
     }; 

     return client.GetDataFromServerAsync(request); 
    } 
} 
+2

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

+0

आप कार्य का इंतजार कर सकते हैं GetDataFromServerAsync उपयोग ब्लॉक के अंत के बाद ठीक से लौटाता है (कार्य को एक चर को असाइन करें)। –

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