.NET 4.5 WCF सेवा में async समर्थन को कैसे जोड़ें, ताकि मौजूदा क्लाइंट को बाधित न हो?



asynchronous async-await (1)

.NET 4.5 का उपयोग करते हुए, मेरे पास एक SOAP समापन बिंदु के साथ एक मौजूदा WCF सेवा है। मौजूदा क्लाइंट कोड का अधिकतर ChannelFactory<T> प्रॉक्सी दृष्टिकोण का उपयोग कर रहा है

मैं विभिन्न सर्वर साइड I / O और डेटाबेस परिचालनों के लिए async / await मॉडल का समर्थन करने के लिए सेवा को बदलना चाहता हूं I

मुझे जो समस्या आ रही है वह है कि async कीवर्ड को WCF विधि कॉल में जोड़ना Task<T> लिए उनके इंटरफ़ेस हस्ताक्षर को बदलना आवश्यक है Task<T> । इसके बदले में, क्लाइंट कोड में बदलाव की आवश्यकता होती है।

सेवा कोड async "सभी तरह से नीचे रखते हुए रखते हुए," क्या उजागर किए गए API को अपरिवर्तित रखने का एक सरल तरीका है?


जब तक आप शब्द सर्वर XxxxxAsync को शामिल करने के लिए अपने सर्वर साइड विधि का नाम बदलते हैं, XxxxxAsync यह XxxxxAsync हस्ताक्षर नहीं बदलेगा।

WCF स्वचालित रूप से प्रत्येक विधि, एक तुल्यकालिक संस्करण और एक async संस्करण के लिए दो समापन बिंदु बनाती है। आप इसे इसे WCF परीक्षण क्लाइंट के साथ देख सकते हैं

उदाहरण के लिए, निम्न सेवा अनुबंध

[ServiceContract]
public interface IService1
{
    [OperationContract]
    string GetData(int value);
}

public class Service1 : IService1
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }
}

जब आप WCF परीक्षण क्लाइंट को आग लगाते हैं तो आपको 2 तरीके उपलब्ध दिखाई देंगे

अगर मैं कोड को निम्नलिखित में बदलता हूं

[ServiceContract]
public interface IService1
{
    [OperationContract]
    Task<string> GetDataAsync(int value);
}

public class Service1 : IService1
{
    public async Task<string> GetDataAsync(int value)
    {
        await Task.Delay(value);
        return string.Format("You entered and awaited: {0}", value);
    }
}

मैं अभी भी अपने क्लाइंट से तुल्यकालिक string GetData(int) विधि को कॉल कर सकता हूं

ध्यान दें, आप एपीआई का प्रतिनिधित्व करने के लिए एक ही इंटरफ़ेस क्लाइंटसाइड और सर्वरसाइड का उपयोग करने में सक्षम नहीं होंगे (और आप वास्तव में नहीं होना चाहिए, क्लाइंट साइड इंटरफ़ेस में दोनों संस्करण होना चाहिए। इस तरह क्लाइंट तय कर सकता है कि वह क्या करना चाहता है एक अवरुद्ध कॉल या नहीं) आप फिर भी उन दोनों के बीच साझा मॉडल का उपयोग करने में सक्षम होंगे।





channelfactory