2008-11-10 13 views
5

बनाने का सबसे पोर्टेबल तरीका क्या है, मैं डब्ल्यूसीएफ का उपयोग करके कुछ स्थिति जानकारी का खुलासा करने के लिए सर्वर एप्लिकेशन प्राप्त करने का प्रयास कर रहा हूं। विशेष रूप से मैं आरएसटीएफ "एपीआई" के साथ डब्ल्यूसीएफ सेवाओं का उपयोग करने के बाद हूं। मैं एक दीवार के कुछ मार कर रहा हूँ जब यह लेने वाली एक Silverlight एप्लिकेशन/पेज है कि मैं ग्राहक एक अन्य प्रकार के रूप में करना चाहते हैं से REST API की बात आती है ...सिल्वरलाइट और नियमित .NET REST क्लाइंट

अब तक मैं करने में सफल रहे गए हैं

public static class StatusUriTemplates 
{ 
    public const string Status = "/current-status"; 
    public const string StatusJson = "/current-status/json"; 
    public const string StatusXml = "/current-status/xml"; 
} 
[ServiceContract] 
public interface IStatusService 
{ 
    [OperationContract] 
    [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = StatusUriTemplates.StatusJson)] 
    StatusResultSet GetProgressAsJson(); 

    [OperationContract] 
    [WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = StatusUriTemplates.StatusXml)] 
    StatusResultSet GetProgressAsXml(); 

    [OperationContract] 
    [WebGet(UriTemplate = StatusUriTemplates.Status)] 
    StatusResultSet GetProgress(); 
} 

सर्वर में यह लागू करने:

:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
    public class ServerStatusService : IStatusService 
    { 
    public StatusResultSet GetProgressAsJson() 
    { return GetProgress(); } 

    public StatusResultSet GetProgressAsXml() 
    { return GetProgress(); } 

    public StatusResultSet GetProgress() 
    { 
     return StatusResultSet.Empty; 
    } 
    } 

कार्यावधि में मेरी कोड से संपर्क में लाने वाला स्थिति इंटरफेस को परिभाषित

मैं भी एक .NET कंसोल/winfoems/WPF आवेदन से सेवा लेने वाली इस की रेखा के साथ कुछ का उपयोग कर के साथ सफल किया गया है:

var cf = new WebChannelFactory<IStatusService>(new Uri("http://localhost:8000/server/status")); 
    var ss = cf.CreateChannel(); 
    Console.WriteLine(ss.GetProgress().TimeStamp); 

"दीवार" मैं मार रहा है कि है वहाँ SliverLight के लिए कोई WebChannelFactory नहीं है।

अवधि।

इसका मतलब यह है कि जब यह Silverlight कोड की बात आती है, मेरे विकल्प हैं:

  • लिखें बदसूरत कोड WebClient, जो अंततः मतलब है जब भी मैं एक परिवर्तन किया है मैं होगा कोड के दो सेट को अद्यतन करने का उपयोग कर मेरी एपीआई
  • उपयोग साबुन/WebService के लिए WS और से सेवा संदर्भ को अद्यतन करने के रखने के दृश्य स्टूडियो के लिए

क्या Silverlight में WebChannelFactory के साथ "साफ" कार्यान्वयन रखने का कोई तरीका है? शायद सिल्वरलाइट के लिए एक सार्वजनिक डोमेन/ओपन सोर्स WebChannelFactory?

इसके साथ किसी भी मदद की सराहना की जाएगी!

+0

उस पर कोई प्रगति? – andrecarlucci

उत्तर

1

मुझे लगभग सुझाव देने से नफरत है, लेकिन क्या आप reimplementing the WebChannelFactory<T> class के साथ सहज महसूस करेंगे?

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

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

क्षमा करें मेरे पास अधिक गहराई से सुझाव नहीं है। :)

+0

मुझे लगता है कि मैं कारखाने वर्ग को फिर से कार्यान्वित करने के आपके प्रस्ताव का पालन करूंगा। मुझे लगता है कि मैं लिनफू जैसे कुछ भारी भारोत्तोलन करने के लिए कुछ उपयोग करूंगा। मुझे सिर्फ यह देखने की ज़रूरत है कि क्या लिनफू सिल्वरलाइट – damageboy

+0

@damageboy पर काम करता है या नहीं? – andrecarlucci

1

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

तो ऐसा करने के लिए, आपको वेब क्लाइंट से एसिंक फैशन में डेटा कैप्चर करने की आवश्यकता होगी और फिर इसे LINQ से XML में पार्स करना होगा। http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

मूलतः, यह इस तरह दिखता है:

समय ह्यूअर उसकी साइट पर एक अच्छा उदाहरण है

WebClient rest = new WebClient(); 
rest.DownloadStringCompleted += new DownloadStringCompletedEventHandler(rest_DownloadStringCompleted); 
rest.DownloadStringAsync(new Uri("http://example.org/current-status/xml")); 

फिर में अपने "rest_DownloadStringCompleted" आप XML के रूप में स्ट्रिंग पार्स चाहते हैं। इसलिए जैसा:

string data = e.Result; 
string url = string.Empty; 

XDocument doc = XDocument.Parse(e.Result); 
var myResults = from results in doc.Descendants("myXmlElement") ... blah blah blah 

मैं WCF और Silverlight से घर बड़े हो गए बाकी सेवाओं के साथ एक ही बात किया है और यह बहुत अच्छा काम किया।

+0

मुझे इस तरह के समाधान पसंद नहीं हैं क्योंकि यह क्लाइंट और सर्वर के बीच निर्भरता बनाता है जो कोड में व्यक्त नहीं है। अगर मैं अपनी सेवा पर काम करने के तरीके को दोबारा बदलना/बदलना चाहता हूं तो मुझे मूल रूप से यह सुनिश्चित करना होगा कि सर्वर + क्लाइंट में परिवर्तन किए गए हों। प्रॉक्सी उस आवश्यकता को समाप्त करता है। – damageboy

1

अब तक मुझे सिल्वरलाइट में आरईएसटी सेवाओं का उपभोग करने के लिए WebChannelFactory के कुछ विकल्प मिल गए हैं। उन्होंने सभी मंचों और ब्लॉगों में प्रशंसा देखी है, लेकिन मैंने अभी तक उनमें से किसी को भी कोशिश नहीं की है। मुझे लगता है कि सीएलआर वस्तुओं में अनुरोध प्रतिक्रियाओं को आसानी से deserialize करने के लिए सभी तीन उपयोग जेनेरिक।

मैं RestSharp की ओर झुकाव रहा हूँ WCF बाकी स्टार्टर किट से

  • Hammock
  • मोड़ा क्योंकि इसके उदाहरण दोनों सरल और मेरे लिए विस्तृत देखो।

    0

    मैं हाल ही में एक ही समस्या में पड़ गए और एक वर्ग सिल्वरलाइट, कम या ज्यादा WebChannelFactory की तरह के लिए एक सरल बाकी ग्राहक इंटरफ़ेस है कि बनाने का फैसला किया। सिंक्रोनस-जैसे व्यवहार भी है।

    http://regular-language.blogspot.com/2011/06/wcf-webhttp-rest-client-for-silverlight.html

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