文档:JsonRpc部分

This commit is contained in:
若汝棋茗
2024-11-12 21:39:50 +08:00
parent 8f4ed14f00
commit 6febe972e9

View File

@@ -4,6 +4,8 @@ title: 产品及架构介绍
--- ---
import Tag from "@site/src/components/Tag.js"; import Tag from "@site/src/components/Tag.js";
import CardLink from "@site/src/components/CardLink.js";
### 定义 ### 定义
@@ -14,7 +16,7 @@ import Tag from "@site/src/components/Tag.js";
JsonRpc是**通用**的Rpc规范与**编程语言无关、操作系统无关**。详细说明请参阅[JsonRpc 2.0 官方文档](https://www.jsonrpc.org/specification)在TouchSocket中封装了**前后端**,使其使用更加方便、高效。 JsonRpc是**通用**的Rpc规范与**编程语言无关、操作系统无关**。详细说明请参阅[JsonRpc 2.0 官方文档](https://www.jsonrpc.org/specification)在TouchSocket中封装了**前后端**,使其使用更加方便、高效。
目前支持TcpHttpWebsocket三种协议调用。 目前支持`Tcp`、`Http`、`WebSocket`三种协议调用。
## 二、特点: ## 二、特点:
@@ -29,7 +31,7 @@ JsonRpc是**通用**的Rpc规范与**编程语言无关、操作系统无关*
## 三、定义服务 ## 三、定义服务
在**服务器**端中新建一个类,继承于**RpcServer**或实现IRpcServer然后在该类中写**公共方法**,并用**JsonRpc**性标签标记。 在**服务器**端中新建一个类,继承于`RpcServer`类(或实现`IRpcServer`),然后在该类中写**公共方法**,并用**JsonRpc**性标签标记。
```csharp showLineNumbers ```csharp showLineNumbers
@@ -205,13 +207,13 @@ await service.StartAsync();
## 五、通用调用 ## 五、通用调用
因为JsonRpc是通用调用协议所以只要**适配基础协议**即可直接使用Json字符串调用。 因为`JsonRpc`是通用调用协议,所以只要**适配基础协议**,即可直接使用`Json`字符串调用。
以下字符串只是示例具体的method参数应当遵循当前路由。 以下字符串只是示例具体的method参数应当遵循当前路由。
### 5.1 Tcp协议直接调用 ### 5.1 Tcp协议直接调用
在Tcp协议时按照适配器选择性的是否以\r\n结尾。 `Tcp`协议时,按照适配器,选择性的是否以`\r\n`结尾。
```csharp showLineNumbers ```csharp showLineNumbers
{"jsonrpc": "2.0", "method": "testjsonrpc", "params":["RRQM"], "id": 1} {"jsonrpc": "2.0", "method": "testjsonrpc", "params":["RRQM"], "id": 1}
@@ -219,7 +221,7 @@ await service.StartAsync();
### 5.2 Http协议直接调用 ### 5.2 Http协议直接调用
在Http协议时以`Url+Post`方式即可 `Http`协议时,以`Url+Post`方式即可
```csharp showLineNumbers ```csharp showLineNumbers
{"jsonrpc": "2.0", "method": "testjsonrpc", "params":["RRQM"], "id": 1} {"jsonrpc": "2.0", "method": "testjsonrpc", "params":["RRQM"], "id": 1}
@@ -227,7 +229,7 @@ await service.StartAsync();
### 5.3 Websocket协议直接调用 ### 5.3 Websocket协议直接调用
在Websocket协议时以`文本类型`,直接发送到服务器即可。 `Websocket`协议时,以`文本类型`,直接发送到服务器即可。
```csharp showLineNumbers ```csharp showLineNumbers
{"jsonrpc": "2.0", "method": "testjsonrpc", "params":["RRQM"], "id": 1} {"jsonrpc": "2.0", "method": "testjsonrpc", "params":["RRQM"], "id": 1}
@@ -236,7 +238,7 @@ await service.StartAsync();
## 六、客户端直接调用 ## 六、客户端直接调用
框架内部提供了JsonRpc的专属客户端可以直接调用也可以生成代理调用。下列将详细介绍。 框架内部提供了`JsonRpc`的专属客户端,可以直接调用,也可以生成代理调用。下列将详细介绍。
### 6.1 Tcp协议 ### 6.1 Tcp协议
@@ -287,7 +289,7 @@ a.AddRpcStore(store =>
}); });
``` ```
然后把生成的.cs文件复制或链接到客户端项目。然后客户端直接使用同名`扩展方法`即可调用。 然后把生成的`.cs`文件复制(或链接)到客户端项目。然后客户端直接使用同名`扩展方法`即可调用。
```csharp showLineNumbers ```csharp showLineNumbers
var sum3 = client.TestJsonRpc("RRQM"); var sum3 = client.TestJsonRpc("RRQM");
@@ -295,7 +297,7 @@ var sum3 = client.TestJsonRpc("RRQM");
### 6.5 使用DispatchProxy代理调用 ### 6.5 使用DispatchProxy代理调用
使用DispatchProxy代理调用可以实现动态代理详情请看[DispatchProxy代理生成](./rpcgenerateproxy.mdx) 使用`DispatchProxy`代理调用,可以实现动态代理,详情请看[DispatchProxy代理生成](./rpcgenerateproxy.mdx)
首先,需要声明一个基类,用于通讯基础。 首先,需要声明一个基类,用于通讯基础。
@@ -332,7 +334,7 @@ internal class MyJsonRpcDispatchProxy : JsonRpcDispatchProxy
:::tip 提示 :::tip 提示
此处其他协议的JsonRpc也是完全支持的。 此处其他协议的`JsonRpc`也是完全支持的。
::: :::
@@ -361,11 +363,15 @@ while (true)
## 七、反向Rpc服务器主动调用客户端 ## 七、反向Rpc服务器主动调用客户端
框架提供了反向Rpc即服务器主动调用客户端。该功可以用于web等多端。具体使用如下: 框架提供了反向`Rpc`,即**服务器主动调用客户端**。该功可以用于`Web`等多端。
首先需要像常规Rpc一样声明一个Rpc服务。然后需要使用`JsonRpc`特性表示 反向Rpc必须在全双工协议下使用如`WebSocket`、`Tcp`等
```csharp showLineNumbers 具体使用如下:
首先,需要在*客户端*像常规`Rpc`一样声明一个`Rpc`服务。然后需要使用`JsonRpc`特性表示。
```csharp {3} showLineNumbers
public partial class ReverseJsonRpcServer : RpcServer public partial class ReverseJsonRpcServer : RpcServer
{ {
[JsonRpc(MethodInvoke = true)] [JsonRpc(MethodInvoke = true)]
@@ -376,39 +382,38 @@ public partial class ReverseJsonRpcServer : RpcServer
} }
``` ```
然后在插件注册全局`RpcStore`。并注册服务。 然后注册服务。
```csharp showLineNumbers ```csharp {5-8} showLineNumbers
var client = new WebSocketJsonRpcClient(); var jsonRpcClient = new WebSocketJsonRpcClient();
await client.SetupAsync(new TouchSocketConfig() await jsonRpcClient.SetupAsync(new TouchSocketConfig()
.ConfigurePlugins(a => .ConfigureContainer(a =>
{ {
a.UseGlobalRpcStore() a.AddRpcStore(store =>
.ConfigureRpcStore(store => {
{ store.RegisterServer<ReverseJsonRpcServer>();
store.RegisterServer<ReverseJsonRpcServer>(); });
}); })
}) .SetRemoteIPHost("ws://127.0.0.1:7707/ws"));//此url就是能连接到websocket的路径。
.SetRemoteIPHost("ws://127.0.0.1:7707/ws"));//此url就是能连接到websocket的路径。 await jsonRpcClient.ConnectAsync();
await client.ConnectAsync();
``` ```
在服务器端中拿到IHttpSessionClient对象。然后调用GetJsonRpcActionClient扩展方法获取到jsonRpcClient。然后调用Invoke等。 在服务器端中,拿到`IHttpSessionClient`对象。然后调用`GetJsonRpcActionClient`扩展方法获取到`IJsonRpcClient`。然后调用`Invoke`等。
下列示例演示的是当WebSocket连接上时服务器主动调用客户端。 下列示例演示的是,当`WebSocket`连接上时,服务器主动调用客户端。
```csharp showLineNumbers ```csharp {8,10} showLineNumbers
class MyPluginClass : PluginBase, IWebSocketHandshakedPlugin<IHttpSessionClient> class MyPluginClass : PluginBase, IWebSocketHandshakedPlugin
{ {
public async Task OnWebSocketHandshaked(IHttpSessionClient client, HttpContextEventArgs e) public async Task OnWebSocketHandshaked(IHttpSessionClient client, HttpContextEventArgs e)
{ {
try try
{ {
//获取JsonRpcActionClient用于执行反向Rpc //获取JsonRpcActionClient用于执行反向Rpc
var client = client.GetJsonRpcActionClient(); var jsonRpcClient = client.GetJsonRpcActionClient();
var result = await client.InvokeTAsync<int>("Add", InvokeOption.WaitInvoke, 10, 20); var result = await jsonRpcClient.InvokeTAsync<int>("Add", InvokeOption.WaitInvoke, 10, 20);
Console.WriteLine(result); Console.WriteLine($"反向调用成功,结果={result}");
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -425,4 +430,6 @@ class MyPluginClass : PluginBase, IWebSocketHandshakedPlugin<IHttpSessionClient>
::: :::
[本文示例Demo](https://gitee.com/RRQM_Home/TouchSocket/tree/master/examples/JsonRpc) ## 八、本文示例Demo
<CardLink link="https://gitee.com/RRQM_Home/TouchSocket/tree/master/examples/JsonRpc"/>