2012-01-30 14 views
5

मैं वर्तमान में हमारे ऐप्स के लिए आरपीसी ढांचे के रूप में उपयोग करने के लिए थ्रिफ्ट को देख रहा हूं (ज्यादातर सी # और सिल्वरलाइट में लिखा गया है)। मैं एक सेवा को कार्यान्वित करने और इसे सी # कंसोल ऐप से उपभोग करने के लिए आया हूं (परिवहन के रूप में सॉकेट का उपयोग करके)।मैं सी # थ्रिफ्ट सेवा कैसे कार्यान्वित करूं और इसे सिल्वरलाइट क्लाइंट के साथ उपभोग करूं?

सी # सर्वर साइड कोड मेरी कोड की तरह दिखाई देता है: (मूल रूप से कॉपी करने ट्यूटोरियल स्रोत कोड के साथ शामिल)

MyServiceHandler handler = new MyServiceHandler(); 
MyService.Processor processor = new MyService.Processor(handler); 
TServerTransport serverTransport = new TServerSocket(9090); 
TServer server = new TSimpleServer(processor, serverTransport); 
server.Serve(); 

क्लाइंट पक्ष कोड यह की तरह दिखाई देता लिए:

TTransport transport = new TSocket("localhost", 9090); 
TProtocol protocol = new TBinaryProtocol(transport); 
MyService.Client client = new MyService.Client(protocol); 
transport.Open(); 
client.SomeServiceCall(); 

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

+0

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

+0

मैंने कुछ नमूना कोड जोड़ा –

+0

MyService क्या दिखता है? – Chazt3n

उत्तर

0

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

मेरे पास इससे संबंधित एक साधारण विकल्प है। सिल्वरलाइट सक्षम वेब सेवा लिखें और इसे क्लाइंट से उपभोग करें।

उदाहरण के लिए, सर्वर पक्ष पर आप एक वेब सेवा प्राप्त कर सकते हैं जो इस तरह सम्मिलित/अद्यतन/पढ़ा आदि करता है। मैं बस कुछ कोड खींचने में कामयाब रहा जिसे हम अपनी परियोजना के लिए उपयोग करते हैं। उम्मीद है की यह मदद करेगा।

using Apache.Cassandra; 
using Thrift.Protocol; 
using Thrift.Transport; 

namespace CassandraWebLibrary 
{ 
    public class MyDb 
    { 
     String _host; 
     int _port; 
     String _keyspace; 
     bool _isConnected; 
     TTransport _transport = null; 
     Apache.Cassandra.Cassandra.Client _client = null; 
     String columnFamily = "ColumnFamilyName"; 
     public VazhikaattiDB(String host, int port, String keyspace) 
     { 
      _host = host; 
      _port = port; 
      _keyspace = keyspace; 
      _isConnected = false; 
     } 

     public bool Connect() 
     { 
      try 
      { 
       _transport = new TFramedTransport(new TSocket(_host, _port)); 
       TProtocol protocol = new TBinaryProtocol(_transport); 
       _client = new Apache.Cassandra.Cassandra.Client(protocol); 

       _transport.Open(); 

       _client.set_keyspace(_keyspace); 

       _isConnected = true; 
      } 
      catch (Exception ex) 
      { 
       log.Error(ex.ToString()); 
      } 
      return _isConnected; 
     } 

     public bool Close() 
     { 
      if (_transport.IsOpen) 
       _transport.Close(); 
      _isConnected = false; 
      return true; 
     } 

     public bool InsertData(Send your data as parameters here) 
     { 
      try 
      { 
       List<Column> list = new List<Column>(); 
       string strKey = keyvalue; 

       #region Inserting into Coulmn family 
       List<Byte> valbytes = new List<byte>(BitConverter.GetBytes(value)); //You might have to pad this with more bytes to make it length of 8 bytes 

       Column doublecolumn1 = new Column() 
       { 
        Name = Encoding.UTF8.GetBytes("column1"), 
        Timestamp = timestampvalue, 
        Value = valbytes.ToArray() 
       }; 
       list.Add(doublecolumn1); 

       Column stringcolumn2 = new Column() 
       { 
        Name = Encoding.UTF8.GetBytes("column2"), 
        Timestamp = timestampvalue, 
        Value = Encoding.UTF8.GetBytes("StringValue") 
       }; 
       list.Add(stringcolumn2); 

       Column timecolumn3 = new Column() 
       { 
        Name = Encoding.UTF8.GetBytes("column3"), 
        Timestamp = timestampvalue, 
        Value = BitConverter.GetBytes(DateTime.Now.Ticks) 
       }; 
       list.Add(timecolumn3); 
       #endregion 


       ColumnParent columnParent = new ColumnParent(); 
       columnParent.Column_family = columnFamily; 

       Byte[] key = Encoding.UTF8.GetBytes(strKey); 
       foreach (Column column in list) 
       { 
        try 
        { 
         _client.insert(key, columnParent, column, ConsistencyLevel.QUORUM); 
        } 
        catch (Exception e) 
        { 
         log.Error(e.ToString()); 
        } 
       } 

       return true; 
      } 
      catch (Exception ex) 
      { 
       log.Error(ex.ToString()); 
       return false; 
      } 
     } 

     public List<YourReturnObject> GetData(parameters) 
     { 
      try 
      { 
       ColumnParent columnParent = new ColumnParent(); 
       columnParent.Column_family = columnFamily; 
       DateTime curdate = startdate; 

       IndexExpression indExprsecondkey = new IndexExpression(); 
       indExprsecondkey.Column_name = Encoding.UTF8.GetBytes("column"); 
       indExprsecondkey.Op = IndexOperator.EQ; 

       List<Byte> valbytes = PadLeftBytes((int)yourid, 8); 
       indExprsecondkey.Value = valbytes.ToArray(); 
       indExprList.Add(indExprsecondkey); 


       IndexClause indClause = new IndexClause() 
       { 
        Expressions = indExprList, 
        Count = 1000, 
        Start_key = Encoding.UTF8.GetBytes("") 
       }; 

       SlicePredicate slice = new SlicePredicate() 
       { 
        Slice_range = new SliceRange() 
        { 
         //Start and Finish cannot be null 
         Start = new byte[0], 
         Finish = new byte[0], 
         Count = 1000, 
         Reversed = false 
        } 
       }; 
       List<KeySlice> keyslices = _client.get_indexed_slices(columnParent, indClause, slice, ConsistencyLevel.ONE); 
       foreach (KeySlice ks in keyslices) 
       { 
        String stringcolumnvalue = Encoding.UTF8.GetString(cl.Column.Value); 
        double doublevalue= (Double)BitConverter.ToDouble(cl.Column.Value); 
        long timeticks = BitConverter.ToInt64(cl.Column.Value, 0); 
        DateTime dtcolumntime = new DateTime(timeticks); 
       } 
      } 
      catch (Exception ex) 
      { 
       log.Error(ex.ToString()); 
      } 

      return yourdatalist; 
     } 


    } 
} 

अब ऊपर वर्ग अपने वेब सेवा, जो बारी में सिल्वरलाइट द्वारा उपयोग किया जाएगा द्वारा इस्तेमाल किया जा सकता है। बीटीडब्ल्यू, आपको सर्वर/webservice इत्यादि से डाउनलोड किए जाने वाले डेटा के आकार जैसे अन्य चांदी के मुद्दों का ख्याल रखना होगा, एफवाईआई, कैसंड्रा की हमारी ग्राहक सेवा पोर्ट 9160 पर चलती है ..

+0

हाय मुथू, एक इंटरमीडिएट वेब सेवा लिख ​​नहीं रहा है एक अनुकूलित थ्रिफ्ट सेवा लिखने की वस्तु को हराने? मेरी सोच यह है कि HTTP के माध्यम से थ्रिफ्ट सेवा के साथ संवाद करना संभव होना चाहिए। –

+0

मुझे ऐसा नहीं लगता है। आपके द्वारा निर्दिष्ट विकल्प ऐसा लगता है कि मैं सीधे डेटाबेस तक पहुंचने के लिए जावास्क्रिप्ट, चांदी की रोशनी आदि जैसे क्लाइंट स्क्रिप्ट देने के लिए तैयार हूं (सभी सुरक्षा आदि के साथ हो सकता है)। अधिकांश डेटाबेस इस तरह के प्रत्यक्ष पहुंच आईएमओ नहीं देते हैं। – Muthu

1

ऐसा लगता है कि यह समस्या पहले ही this guy द्वारा संबोधित किया गया था। this JIRA के अनुसार, यह फ़िक्स थ्रिफ्ट 0.9 में उपलब्ध है। आप या तो this snapshot (ध्यान दें कि, क्योंकि यह अंतिम रिलीज नहीं है, यह स्थिर नहीं हो सकता है) या आप 0.812 रिलीज के लिए this patch लागू कर सकते हैं।

+0

धन्यवाद npclaudiu, मैं पहले से ही थिफ्ट 0.9 का उपयोग कर रहा हूं जिसमें उसके पैच शामिल हैं, मेरे पास इसका उपयोग करने के लिए कोई सुराग नहीं है; इसलिए मेरा सवाल है। –

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