说明
一般的RPC服务都是客户端发起,服务器响应。但是有时候也需要服务器主动调用客户端,所以反向RPC应运而生。
定义、发布反向RPC服务
实际上,RpcClient也实现了IRpcParser接口,这意味着反向RPC其实也是RPC,只不过,当客户端和服务器建立连接以后,就不再区分谁是客户端,谁是服务器了。只关心,谁能提供服务,谁在调用服务。
- 在客户端项目中定义服务
- 用TouchRpc标记
public class ReverseCallbackServer : ServerProvider{[TouchRpc]public int ConPerformance(int age){return ++age;}}
【客户端发布服务】
发布服务,实际上是让TcpRpcClient也拥有提供RPC的能力。
RpcService service = new RpcService();//service.ShareProxy(new IPHost(8848));//分享反向代理RPC代理文件,需要时调用TcpRpcClient client = new TcpRpcClient();service.AddRpcParser("client", client);//添加解析service.RegisterServer<ReverseCallbackServer>();//注册服务client.Setup(new RRQMConfig().SetRemoteIPHost(new IPHost("127.0.0.1:7789")).SetProxyToken("RPC"));client.Connect("123RPC");client.DiscoveryService("RPC");Console.WriteLine("成功连接");
三、调用反向RPC
服务器回调客户端,最终必须通过RpcSocketClient或派生类来调用。
并且,RpcSocketClient已实现IRpcClient接口,意味着,反向RPC也可以使用代理调用。所有用法和RPC一致。
3.1 获取RpcSocketClient的途径
除了继承TcpService的获取方式以外,RPC还支持调用上下文获取。具体操作如下:
- RRQMRPC标签属性中声明IncludeCallContext
- 服务方法的第一个参数必须为ICallContext的接口或派生类。
【通过调用上下文】
[Description("测试调用上下文")][RRQMRPC(MethodFlags.IncludeCallContext)]public string GetCallerID(ICallContext callContext){if (callContext.Caller is RpcSocketClient socketClient){return socketClient.ID;}return null;}
