我正在尝试在多层 API 上实现 Hotchocolate,如下所示
A -> B -> C、D、E、...
这是我的要求:
{
objectC(id: 111){
fieldA
fieldB
}
}
如果我从 B 执行它,它会完美运行,我可以重新执行它而不会出现任何错误。
当我从 A 执行相同的请求时,它在第一次调用时有效,但下一次调用(相同的请求正文)每次我不重新启动 B 服务时都会返回“不支持指定的方法”。如果我在请求中添加一个新字段,它会执行相同的操作,在第一次执行时有效,在下一次执行时出错。
C、D、E、.. 定义了 Hotchocolate GraphQL 的 EntityFramework 实现,没有任何扩展。它实现了 Dataloaders :
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", (sp, client) => { client.BaseAddress = new Uri(Configuration.GetValue<string>("urls:ObjectD") + "/v1/graphql"); });
services.AddHttpClient("ObjectE", (sp, 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", (sp, 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”上有一些缓存,我尝试了很多配置(请求选项、跟踪首选项、严格验证......)但结果相同。
请帮忙 !:)