如何解决Hotchocolate - 不支持指定的方法
我正在尝试在如下所示的多层 API 上实现 Hotchocolate
A -> B -> C、D、E、...
这是我的要求:
{
objectC(id: 111){
fieldA
fieldB
}
}
如果我从 B 执行它,它运行得很好,我可以重新执行它而没有任何错误。
当我从 A 执行相同的请求时,它在第一次调用时起作用,但下一个(相同的请求正文)每次将返回“不支持指定的方法”,而我不重新启动 B 服务。如果我在请求中添加一个新字段,它会做同样的事情,在第一次执行时起作用,在下一次执行时出错。
C、D、E、.. 定义了 Hotchocolate GraphQL 的 EntityFramework 实现,没有任何扩展。它实现了数据加载器:
private void ConfigureServicesGraphQL(IServiceCollection services)
{
services
.AddGraphQLServer()
.AddQueryType(d => d.Name("Query"))
.AddType<ObjectCQuery>()
.AddType<ObjectCType>()
.AddDataLoader<ObjectCByIdDataLoader>()
.EnableRelaySupport()
.AddFiltering()
.AddSorting();
}
B 实现 C、D、E 等的拼接模式并扩展类型以增加业务价值:
private void ConfigureServicesGraphQL(IServiceCollection services)
{
// Clients
services.AddHttpClient("ObjectC",(sp,client) => { client.BaseAddress = new Uri(Configuration.GetValue<string>("urls:ObjectC") + "/v1/graphql"); });
services.AddHttpClient("ObjectD",client) => { client.BaseAddress = new Uri(Configuration.GetValue<string>("urls:ObjectD") + "/v1/graphql"); });
services.AddHttpClient("ObjectE",client) => { client.BaseAddress = new Uri(Configuration.GetValue<string>("urls:ObjectE") + "/v1/graphql"); });
services
.AddGraphQLServer()
// Remote Schemas
.AddRemoteSchema("ObjectC",false)
.AddRemoteSchema("ObjectD",false)
.AddRemoteSchema("ObjectE",false)
// Extensions
.AddTypeExtensionsFromFile("ObjectCExtensions.graphql")
.AddTypeExtensionsFromFile("ObjectDExtensions.graphql")
.AddTypeExtensionsFromFile("ObjectEExtensions.graphql")
// Options
.AddErrorFilter<GraphQLErrorFilter>();
}
A 实现 B 的拼接模式并扩展类型以增加新的业务价值:
private void ConfigureServicesGraphQL(IServiceCollection services)
{
// Clients
services.AddHttpClient("ObjectB",client) => { client.BaseAddress = new Uri(Configuration.GetValue<string>("urls:ObjectB") + "/v1/graphql"); });
services.AddGraphQLServer()
// Merge Directive Rule to manage multi layered stitching
.AddDirectiveMergeRule(next => (c,d) =>
{
List<IDirectiveTypeInfo> newDirectives = new List<IDirectiveTypeInfo>();
List<IDirectiveTypeInfo> returnedValue = (List<IDirectiveTypeInfo>)d;
List<string> dirToRemove = new List<string>()
{
"delegate","cost","computed","source"
};
foreach (var dti in returnedValue)
{
ISchemaInfo si = dti.Schema;
foreach (var dir in dirToRemove)
((Dictionary<string,DirectiveDefinitionNode>)si.Directives).Remove(dir);
if (!dirToRemove.Contains(dti.Definition.Name.Value))
newDirectives.Add(new DirectiveTypeInfo(dti.Definition,si));
}
next(c,newDirectives);
})
.AddRemoteSchema("ObjectB")
.AddTypeExtensionsFromFile("Extensions.graphql")
.AddErrorFilter<GraphQLErrorFilter>()
}
我不明白为什么同一个请求不能工作两次..我假设在“B”上有一些缓存,我尝试了很多配置(请求选项、跟踪首选项、严格验证......)但结果相同。
请帮忙! :)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。