#.net-core #graphql #hotchocolate
#.net-core #graphql #hotchocolate
Вопрос:
Я пытаюсь реализовать Hotchocolate на многоуровневых API, например, следующим образом
A -> B -> C, D, E, …
Вот мой запрос :
{
objectC(id: 111){
fieldA
fieldB
}
}
Если я выполняю это из B, оно работает отлично, я могу повторно выполнить его без каких-либо ошибок.
Когда я выполняю этот же запрос от A, он работает при первом вызове, но следующие (то же тело запроса) будут возвращать «Указанный метод не поддерживается» каждый раз, пока я не перезапущу службу B. Если я добавляю новое поле в запрос, оно делает то же самое, работает при первом выполнении и выдает ошибки при следующих.
C, D, E, .. определяет EntityFramework реализацию Hotchocolate GraphQL без какого-либо расширения. Он реализует загрузчики данных :
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 и extend для добавления новой бизнес-ценности :
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» есть некоторый кеш, я перепробовал множество конфигураций (параметры запросов, настройки трассировки, строгая проверка …), Но результат тот же.
Помогите, пожалуйста! 🙂
Комментарии:
1. У вас есть решение для этого?