HotChocolate.SchemaException报错求助:返回500而非200状态
解决HotChocolate.SchemaException:无法解析输入接口类型的问题
核心原因
你遇到的错误是因为HotChocolate构建GraphQL Schema时,无法将IAuthorizationService、IProjectsRepository、ISpecificationsRepository这类服务/仓储接口解析为有效的GraphQL输入类型。GraphQL输入类型要求是带属性的具体DTO类,而依赖注入的服务/仓储接口应该通过DI容器注入到Resolver方法中,而非作为GraphQL请求的输入参数。
解决步骤
1. 修正Resolver方法参数定义
排查你的Resolver方法,确保没有把依赖注入的接口作为GraphQL输入参数传递。
错误示例:
// 错误写法:将仓储接口作为输入参数 public async Task<Project> CreateProject(IProjectsRepository repo, [GraphQLNonNull] ProjectInput input) { // ...业务逻辑 }
正确写法:通过构造函数或方法注入获取服务/仓储,输入参数仅保留GraphQL需要的DTO:
// 正确写法:仓储通过构造函数注入 private readonly IProjectsRepository _repo; public ProjectResolver(IProjectsRepository repo) { _repo = repo; } public async Task<Project> CreateProject([GraphQLNonNull] ProjectInput input) { return await _repo.CreateAsync(input); }
2. 定义并使用具体的输入DTO类
如果需要传递复杂输入数据,必须创建对应的DTO类,例如:
public class ProjectInput { public string Name { get; set; } public string Description { get; set; } // 其他业务所需属性 }
若自动类型发现失效,可在Schema配置中显式注册输入类型:
builder.Services.AddGraphQLServer() .AddQueryType<Query>() .AddMutationType<Mutation>() .AddInputType<ProjectInput>();
3. 确认依赖注入配置正确
确保所有服务/仓储接口已正确注册到ASP.NET Core依赖注入容器:
// Program.cs/Startup.cs中注册服务 builder.Services.AddScoped<IProjectsRepository, ProjectsRepository>(); builder.Services.AddScoped<ISpecificationsRepository, SpecificationsRepository>(); builder.Services.AddAuthorization(); // IAuthorizationService由该方法默认注册
4. 清理Schema缓存(开发环境)
若修改代码后仍报错,可能是Schema缓存导致。重启应用或在开发环境禁用缓存:
builder.Services.AddGraphQLServer() .ModifyOptions(options => { options.EnableSchemaCache = false; });
验证修复
完成上述操作后重启应用,重新发送GraphQL请求,应返回200状态码,不再抛出SchemaException。
内容的提问来源于stack exchange,提问作者JB Sundaray
相关产品推荐
相关产品推荐

