- 精确获取需要的数据:
- 单一端点:
- 类型系统:
- 查询与修改:
- 实时数据(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();

如果以上内容对你有帮助,欢迎大佬们点赞、关注公众号或转发。谢谢大家!