2012-01-30 15 views
5

Tôi hiện đang xem Tiết kiệm để sử dụng làm khung RPC cho các ứng dụng của chúng tôi (chủ yếu được viết bằng C# và Silverlight). Tôi đã đi xa như thực hiện một dịch vụ và tiêu thụ nó từ một ứng dụng giao diện điều khiển C# (sử dụng một ổ cắm như vận chuyển).Làm cách nào để triển khai dịch vụ Tiết kiệm C# và tiêu thụ nó với ứng dụng Silverlight?

Đối với C# phía máy chủ mã của tôi trông giống như: (về cơ bản sao chép các hướng dẫn kèm theo mã nguồn)

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

Đối với mã phía khách hàng nó trông giống như:

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

Tuy nhiên , chúng tôi sẽ sử dụng dịch vụ từ một khách hàng Silverlight, và tiếc là không có hỗ trợ cho các ổ cắm trong Silverlight cho Tiết kiệm. Tôi giả sử tôi buộc phải sử dụng giao tiếp HTTP giữa khách hàng và dịch vụ, sử dụng các lớp C# THttpClient và THttpHandler của Thrift? Tôi không thể tìm thấy bất kỳ ví dụ về làm thế nào để làm điều này ra khỏi đó, bất cứ ai có thể chỉ cho tôi đi đúng hướng? Một số ví dụ về máy chủ và mã phía máy khách sẽ được đánh giá cao.

+0

Với Silverlight, * và nhiều cân nhắc bảo mật khác nhau *, mẫu thường gọi các dịch vụ bên ngoài từ máy chủ/dịch vụ Web Silverlight hoặc một dịch vụ WCF hoặc RIA khác trên máy chủ của bạn. Điều này có nghĩa là ứng dụng Silverlight của bạn có một cổng gọi cho bất kỳ dịch vụ nào. Bạn có thể cung cấp bất kỳ mã mẫu nào không? –

+0

Tôi đã thêm một số mã mẫu –

+0

MyService trông như thế nào? – Chazt3n

Trả lời

0

Tôi tin rằng bây giờ bạn đã hiểu, không có cách giao tiếp trực tiếp từ Silverlight với cơ sở dữ liệu Cassandra bằng cách sử dụng Tiết kiệm hoặc bất kỳ khách hàng nào khác.

Tôi có một tùy chọn đơn giản liên quan đến điều này. Viết một dịch vụ web đã bật Silverlight và tiêu thụ nó từ máy khách.

Ví dụ: ở phía máy chủ, bạn có thể có dịch vụ web chèn/cập nhật/đọc v.v., như thế này. Tôi chỉ quản lý để rút ra một số mã mà chúng tôi sử dụng cho dự án của chúng tôi. Hi vọng điêu nay co ich.

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; 
     } 


    } 
} 

Bây giờ lớp trên có thể được sử dụng bởi dịch vụ web của bạn, do đó sẽ được Silverlight sử dụng. Btw, bạn sẽ phải xử lý các vấn đề khác về Silverlight như kích thước dữ liệu được tải xuống từ máy chủ/dịch vụ web, v.v., FYI, dịch vụ khách hàng của chúng tôi về Cassandra chạy trên cổng 9160 ..

+0

Hi Muthu, không viết một dịch vụ web trung gian đánh bại đối tượng viết một dịch vụ Tiết kiệm tối ưu? Suy nghĩ của tôi là có thể giao tiếp với dịch vụ Tiết kiệm qua HTTP. –

+0

Tôi không nghĩ vậy. Tùy chọn được bạn chỉ định giống như tôi sẵn sàng cung cấp cho một kịch bản ứng dụng khách như javascript, silverlight, vv, để truy cập trực tiếp vào cơ sở dữ liệu (có thể với tất cả bảo mật, v.v.). Đa số các cơ sở dữ liệu không cung cấp cho IMO truy cập trực tiếp như vậy. – Muthu

1

Có vẻ như vấn đề này đã được giải quyết bằng this guy. Theo số this JIRA, bản sửa lỗi có sẵn ở Tiết kiệm 0,9. Bạn có thể thử this snapshot (lưu ý rằng, vì nó không phải là bản phát hành cuối cùng, nó có thể không ổn định) hoặc bạn có thể áp dụng this patch cho bản phát hành 0.8.

+0

Cảm ơn npclaudiu, tôi đã sử dụng Thirft 0.9 có bản vá của anh ấy, tôi không có manh mối về cách sử dụng nó; do đó câu hỏi của tôi. –

Các vấn đề liên quan