.NET使用Graphql的演示
- 精确获取需要的数据:
- 单一端点:
- 类型系统:
- 查询与修改:
- 实时数据(Subscription):
- 减少数据传输:只返回客户端请求的数据。
- 减少请求数:多个数据需求可以在单一查询中解决。
- 灵活性高:客户端可以自由构造查询,无需服务器频繁更新API。
- 复杂查询性能问题:如果不加限制地进行深度查询或大规模的数据嵌套,可能会对服务器性能造成影响。
- 缓存策略:相比于REST的URL级别缓存,GraphQL需要更复杂的缓存策略来优化性能。
- 学习曲线:对于开发者来说,需要学习新的查询语法及其底层实现。




















- 可扩展性问题:AddInMemorySubscriptions 存储订阅信息是在内存中进行的。这意味着订阅数据仅存在于单个进程中。如果你的应用程序需要在多个服务器实例之间进行扩展,每个实例的内存中都会有独立的订阅状态,从而导致状态不一致。因此,在大型应用或高负载环境中,这种方法不能很好地扩展。
- 持久性缺失:使用内存存储的另一个主要问题是数据的持久性。服务器重启或发生故障时,所有在内存中的订阅数据将丢失。这对于生产环境来说是不可接受的,因为需要保证服务的稳定性和数据的持久性。
- 资源使用效率:随着订阅数量的增加,内存的使用量也会随之上升。在内存资源有限的环境中,这可能会影响应用程序的整体性能和响应速度。
- 故障恢复:在内存中的订阅管理缺乏有效的故障恢复机制。如果系统崩溃或需要进行维护,恢复订阅状态将非常困难,可能需要从客户端重新建立订阅。









// 添加GraphQL服务
builder.Services
.AddGraphQLServer()
.AddQueryType<TestQuery>()
.AddMutationType<TestMutation>()
.AddSubscriptionType<TestSub>()
.AddInMemorySubscriptions(); // 默认消息持久化(生产情况建议更换) var app = builder.Build(); app.UseWebSockets(); // 映射GraphQL端点
app.MapGraphQL();
var option = new GraphQLHttpClientOptions
{
EndPoint = new Uri("http://localhost:5264/graphql"),
// 设置 WebSocket 端点以支持订阅
WebSocketEndPoint = new Uri("ws://localhost:5264/graphql")
}; using var client = new GraphQLHttpClient(/*"http://localhost:5264/graphql"*/ option , new NewtonsoftJsonSerializer());
// var request = new GraphQLRequest
// {
// Query = @"mutation{
// otherOperation(info:{address:""龙岗区宝龙街道"",city:""大大大深圳"",phone:""10100011""})
//}"
// }; // var response = await client.SendQueryAsync<object>(request);
// Console.WriteLine(response.Data); // 定义订阅请求
var subscriptionRequest = new GraphQLRequest
{
Query = @"
subscription {
onTestPublish
}"
}; // 创建订阅流
var subscriptionStream = client.CreateSubscriptionStream<OnTestPublishResponse>(subscriptionRequest); // 订阅消息流
var subscription = subscriptionStream.Subscribe(
response =>
{
if (response.Errors != null)
{
Console.WriteLine("Error occurred: " + response.Errors);
}
else
{
Console.WriteLine($"Received message: {response.Data.OnTestPublish}");
}
},
error => Console.WriteLine($"Subscription error: {error.Message}"),
() => Console.WriteLine("Subscription completed.")); // 模拟其他逻辑(例如,在某个时刻取消订阅,这儿通过输入任意按键触发取消和释放)
Console.WriteLine("Press any key to exit...");
Console.ReadKey(); // 取消订阅并关闭 WebSocket 连接
subscription.Dispose();
client.Dispose();
如果以上内容对你有帮助,欢迎大佬们点赞、关注公众号或转发。谢谢大家!
.NET使用Graphql的演示的更多相关文章
- Graphql入门
Graphql入门 GraphQL是一个查询语言,由Facebook开发,用于替换RESTful API.服务端可以用任何的语言实现.具体的你可以查看Facebook关于GraphQL的文档和各种语言 ...
- 我的前端故事----我为什么用GraphQL
背景 今年我在做一个有关商户的app,这是一个包含商户从入网到审核.从驳回提交到入网维护的完整的生命周期线下推广人员使用的客户端软件,但故事并没有这么简单... 疑问 随着app的逐渐完善,遇到的问题 ...
- 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(上)
为了介绍使用ASP.NET Core构建GraphQL服务器,本文需要介绍一下GraphQL,其实看官网的文档就行. 什么是GraphQL? GraphQL 既是一种用于 API 的查询语言也是一个满 ...
- ASP.NET Core中使用GraphQL - 第六章 使用EF Core作为持久化仓储
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...
- 让ASP.NET Core支持GraphQL之-GraphQL的实现原理
众所周知RESTful API是目前最流行的软件架构风格之一,它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. RESTful的优越性是毋庸置疑 ...
- 边学边做,简单的 GraphQL 实例
项目中有功能要调用 API,对方 API 用的是 GraphQL 实现,就简单学了下,感叹技术进步真快,Facebook 发明的这玩意儿咋这么牛逼,使前端开发人员变得主动起来,想要什么接口.返回什么结 ...
- 完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询
相关阅读: 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能 完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制 自APIJSON发布 ...
- GraphQL学习之原理篇
前言 在上一篇文章基础篇中,我们介绍了GraphQL的语法以及类型系统,算是对GraphQL有个基本的认识.在这一篇中,我们将会介绍GraphQL的实现原理.说到原理,我们就不得不依托于GraphQL ...
- GraphQL入门有这一篇就足够了
GraphQL入门有这一篇就足够了:https://blog.csdn.net/qq_41882147/article/details/82966783 版权声明:本文为博主原创文章,遵循 CC 4. ...
- 一种不错的 BFF Microservice GraphQL/REST API 层的开发方式
云原生(Cloud Native)Node JS Express Reactive 微服务模板 (REST/GraphQL) 这个项目提供了完整的基于 Node JS / Typescript 的微服 ...
随机推荐
- 实现一个终端文本编辑器来学习golang语言:第二章Raw模式下的输入输出
从第二章开始,在每个小节的最后都会有一些代码实操作业,你可以选择自己完成(比较推荐),再对照我的实现方式,当然也可以直接看我的代码实现.不过,之后的各个功能实现,我都会基于我先前的代码实现版本,在它的 ...
- 【转载】 固定随机种子比较强化学习算法——pytorch框架
原文地址: https://www.cnblogs.com/lucifer1997/p/13801102.html ========================================== ...
- C# Cefsharp 如何利用[Attribute]的把C#中的方法给到浏览器中调用
背景 "有没有遇见这样一个场景,需要注入到浏览器的类太多,又想统一管理且不遗漏,有没有什么好办法?""有有有,把头伸过来~" 解决办法 第一步:提供一个[Att ...
- 2024全球数字经济大会:大模型时代下DataOps驱动企业数智化升级
7月5日,以"开源生态筑基础,数字经济铸未来"为主题的2024全球数字经济大会在北京成功举办,来自全国各地的专家学者.企业代表.数据库行业从业人士及众多开源开发者,共聚一堂,共同探 ...
- 从论文到图谱,或许只差一个html
书接上回,在文章<论文图谱当如是:Awesome-Graphs用200篇图系统论文打个样>中,我向大家讲述了如何用图的方式思考图计算系统的演进历史,并在后续的系列文中结合Awesome-G ...
- MPTCP(一) :MPTCP概览
MPTCP概览 参考链接 MPTCP官网 http://multipath-tcp.org/ MPTCP入门 https://access.redhat.com/documentation/zh-cn ...
- hacs安装
安装 HACS 直接使用 Docker 的可视化管理面板 Portainer 或者通过命令行进入 Docker 容器,然后执行以下安装命令: docker exec -it <容器名称或容器ID ...
- Mac 删除 Steam 游戏图标
Steam 将游戏安装在了 ~/Applications,打开访达,前往该目录,将相关游戏移到废纸篓.
- 【图文安装教程】在docker中安装ES
在docker中安装ES怎么安装?本文就教大家怎么安装 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联.这里先创建一个网络: docker ...
- [Panzura] identify user operations(copy, open, read ... ) in audit log
应该属于sequence classificagtion 问题 https://monkeylearn.com/text-classification/ https://machinelearning ...