1+ using Google . Protobuf ;
2+ using Grpc . Core ;
3+ using Rafy . DataPortal ;
4+ using Rafy . Serialization ;
5+ using System ;
6+ using System . Collections . Generic ;
7+ using System . Text ;
8+ using System . Threading . Tasks ;
9+
10+ namespace Rafy . Grpc
11+ {
12+ /// <summary>
13+ /// Rafy DataPortal 的核心 Grpc 服务。
14+ /// </summary>
15+ public class RafyDataTransferService : DataTransferService . DataTransferServiceBase
16+ {
17+ public override Task < GrpcData > Call ( GrpcData GrpcCallRequest , ServerCallContext context )
18+ {
19+ var requestBytes = GrpcCallRequest . Data . ToByteArray ( ) ;
20+ var request = BinarySerializer . DeserializeBytes ( requestBytes ) as GrpcCallRequest ;
21+
22+ LogCalling ( request ) ;
23+
24+ var portal = new FinalDataPortal ( ) ;
25+
26+ object result ;
27+ try
28+ {
29+ result = portal . Call ( request . Instance , request . Method , request . Arguments , request . Context ) ;
30+ }
31+ catch ( Exception ex )
32+ {
33+ result = ex ;
34+ LogException ( request , ex ) ;
35+ }
36+
37+ var responseBytes = BinarySerializer . SerializeBytes ( result ) ;
38+
39+ if ( ! ( result is Exception ) )
40+ {
41+ LogCalled ( request , responseBytes ) ;
42+ }
43+
44+ return Task . FromResult ( new GrpcData
45+ {
46+ Data = ByteString . CopyFrom ( responseBytes )
47+ } ) ;
48+ }
49+
50+ private void LogCalling ( GrpcCallRequest request )
51+ {
52+ var content = $ "Grpc Call invoking. request: method:{ request . Method } , instance: { request . Instance } , arguments.length:{ request . Arguments . Length } ";
53+ var totalBytes = GetTotalBytes ( request ) ;
54+ if ( totalBytes > 0 )
55+ {
56+ content += $ ", arguments bytes:{ totalBytes } ";
57+ }
58+ Logger . LogInfo ( content ) ;
59+ }
60+
61+ private void LogCalled ( GrpcCallRequest request , byte [ ] response )
62+ {
63+ var content = $ "Grpc Call invoked. request: method:{ request . Method } , instance: { request . Instance } , arguments.length:{ request . Arguments . Length } ";
64+ if ( response is byte [ ] bytes )
65+ {
66+ content += $ ", result bytes:{ bytes . Length } ";
67+ }
68+ Logger . LogInfo ( content ) ;
69+ }
70+
71+ private void LogException ( GrpcCallRequest request , Exception ex )
72+ {
73+ Logger . LogError ( $ "Grpc Call Exception occurred! request: method:{ request . Method } , instance: { request . Instance } , arguments.length:{ request . Arguments . Length } .", ex ) ;
74+ }
75+
76+ private int GetTotalBytes ( GrpcCallRequest request )
77+ {
78+ var totalBytes = 0 ;
79+
80+ var arguments = request . Arguments ;
81+ for ( int i = 0 , c = arguments . Length ; i < c ; i ++ )
82+ {
83+ var argument = arguments [ i ] ;
84+ if ( argument is byte [ ] bytes )
85+ {
86+ totalBytes += bytes . Length ;
87+ }
88+ }
89+
90+ return totalBytes ;
91+ }
92+ }
93+ }
0 commit comments