ASP.NET Core中GraphQL订阅如何切换为SubscriptionDocumentExecuter解决报错
问题修复方案
报错原因是默认的DocumentExecuter不支持订阅操作,即使配置了正确的执行策略也需要替换为GraphQL.SystemReactive包提供的SubscriptionDocumentExecuter才能生效,按照以下步骤操作即可:
步骤1:替换默认的文档执行器
在ASP.NET Core服务注册代码(.NET 6+为Program.cs,旧版本为Startup.cs的ConfigureServices方法)中添加IDocumentExecuter的实现注册,覆盖默认实现:
// 必须为单例注册 builder.Services.AddSingleton<IDocumentExecuter, SubscriptionDocumentExecuter>();
步骤2:启用GraphQL订阅与WebSocket支持
注册GraphQL服务时补充订阅和WebSocket相关配置:
builder.Services.AddGraphQL(b => b .AddSchema<DragonSchema>() .AddSystemTextJson() // 若使用Newtonsoft.Json则替换为.AddNewtonsoftJson() .AddSubscriptionSupport() // 启用订阅核心能力 .AddWebSockets() // 注册WebSocket传输协议 );
步骤3:调整中间件注册顺序
中间件配置顺序必须严格遵循以下规则,先启用WebSocket中间件,再注册GraphQL对应处理:
var app = builder.Build(); // CORS、静态文件等其他中间件放在这之前 app.UseWebSockets(); // 先注册GraphQL WebSocket处理中间件 app.UseGraphQLWebSockets<DragonSchema>("/graphql"); // 再注册普通GraphQL处理中间件 app.UseGraphQL<DragonSchema>("/graphql"); // 最后注册Playground app.UseGraphQLPlayground(options => { // 可选:显式指定Playground订阅端点,默认已开启可省略 options.SubscriptionEndpoint = "/graphql"; });
步骤4:保留现有执行策略配置
你当前编写的SelectExecutionStrategy方法逻辑正确,不需要修改,继续保留即可。
额外注意:OpinionMessageService的GetMessages方法必须返回IObservable<OpinionAddedMessage>类型,否则订阅流无法正常推送事件。
内容的提问来源于stack exchange,提问作者user2932893
相关产品推荐
相关产品推荐

