- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
.Net 8.0 下的新RPC
很高兴啊,我们来到了IceRPC之传入响应和拦截器->快乐的RPC, 基础引导,让自已不在迷茫,快乐的畅游世界.
了解如何演绎传入的响应.
调用器 invoker 异步返回传入响应。该传入响应是由连接从对等点接收响应时创建的.
传入响应包含哪些内容
status code
OK
时设置fields
payload
Status code
状态代码表示对等方发送的状态。Ok或错误都可以。StatusCode 是 Slice 中定义的枚举
unchecked enum StatusCode : varuint62 {
Ok = 0
ApplicationError
NotFound
NotImplemented
... more errors ...
}
消耗响应的调用者,使用此状态代码来计算响应有效负载 payload 的内容。例如,当调用者是由 Slice 编译器生成的代码时,它将 Ok 时,意味着响应payload持有 Slice 编码的返回值.
fields
响应字段表示响应携带的带外信息。这些字段通常由中间件middleware和拦截器interceptors读取和写入,以协调服务器和客户端中相同响应的处理.
字段是字典 ResponseFieldKey 中字节序列的条目,其中 ResponseFieldKey 是在 Slice 中定义的枚举.
unchecked enum ResponseFieldKey : varuint62 {
CompressionFormat = 2
...
}
例如,当压缩中间件压缩传出响应的有效负载时,它会设置响应字段 CompressionFormat。这告诉连接另一侧的压缩机拦截器"该有效载荷被 brotli 压缩";然后压缩拦截器可以解压缩该(传入)响应有效负载.
传入响应的有效负载是表示操作返回值的字节流。IceRPC而言,该流中的字节数是未知的.
了解如何编写拦截器以及如何在调用管道中安装拦截器.
拦截器是在通过网络连接发送传出请求之前拦截传出请求的代码。 相同的代码还会在远程服务到达调用者之前拦截它返回的传入响应.
在技术层面上,拦截器是持有另一个调用器(next)并在下一个调用器上调用,调用的调用器invoke,作为其自己的调用方法实现的一部分。 下一个调用器可以是客户端连接、连接缓存、另一个拦截器或其他类型的调用器;就拦截器而言,它只是另一个调用器.
拦截器可以在调用下一个调用器调用调用之前(在发送请求之前)和调用下一个调用器调用调用之后(在收到响应之后)包含逻辑。 拦截器还可以使调用管道短路,返回缓存响应或抛出异常.
例如,一个简单的 C# 拦截器可能如下所示
public class SimpleInterceptor : IInvoker
{
private readonly IInvoker _next;
public SimpleInterceptor(IInvoker next) => _next = next;
public async Task<IncomingResponse> InvokeAsync(OutgoingRequest request, CancellationToken cancellationToken)
{
Console.WriteLine("before _next.InvokeAsync");
IncomingResponse response = await _next.InvokeAsync(request, cancellationToken);
Console.WriteLine($"after _next.InvokerAsync; the response status code is {response.StatusCode}");
return response;
}
}
C# 中,可以通过创建类 Pipeline 的实例,然后调用 Use{Name} 扩展方法来创建调用管道,以便在此管道上安装拦截器.
例如
Pipeline pipeline = new Pipeline()
.UseLogger(loggerFactory)
.UseCompressor()
.Into(clientConnection);
需要使用 Into 指定管道的最后一个调用器。 它通常是客户端连接或连接缓存,但它也可以是另一个管道,因为 Pipeline 本身就是调用器。 当在管道上进行调用时,请求会经过该调用器链。在返回的途中,传入的响应以相反的顺序穿过同一条调用者链.
安装这些拦截器的顺序很重要。 安装的第一个拦截器是第一个执行的拦截器。通过上面创建的管道,日志拦截器首先执行,然后在压缩拦截器上调用 InvokeAsync,最后压缩拦截器在客户端连接上调用 InvokeAsync.
最后此篇关于IceRPC之传入响应和拦截器->快乐的RPC的文章就讲到这里了,如果你想了解更多关于IceRPC之传入响应和拦截器->快乐的RPC的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
当您编写 Happy 描述时,您必须定义所有可能出现的 token 类型。但您只能匹配 token 类型,而不是单个 token 值... 这有点问题。例如,考虑 data 关键字。根据 Haskel
为什么这会引发关于减少/减少冲突的警告 root : set1 'X' | set2 'X' 'X' set1 : 'A' | 'B'
这是代码: /** * some text. */ public class Foo { /** * Some comment... */ public enum Bar {
此导入工作正常,但在某些方面感觉很脏。主要是它使用 slice* 中的特定数字来获取父路径,这会惹恼 flake8 linter。 import os import sys sys.path.appe
我是一名优秀的程序员,十分优秀!